C语言中的sizeof的理解

合集下载

对C语言中的sizeof的介绍分析

对C语言中的sizeof的介绍分析

对C语言中的sizeof的介绍分析对C语言中的sizeof的介绍分析引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是店铺分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读!1.定义sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。

返回值类型为size_t,在头文件stddef.h中定义。

这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char、signed char和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型。

MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or atype (including aggregate types). This keyword returns a value of typesize_t.2. 语法:sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象 );2) sizeof( type_name ); // sizeof( 类型 );3) sizeof object; // sizeof 对象;所以一下三种sizeof的使用都是对的复制代码代码如下:#includemain(){int b;printf("%dn",sizeof b);printf("%dn",sizeof(b));printf("%dn",sizeof(int));}3. 基本数据类型的sizeof这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。

c语言34种运算符意义和用法

c语言34种运算符意义和用法

文章标题:深度解析C语言34种运算符的意义和用法在计算机编程世界中,C语言是一种广泛应用的计算机程序设计语言,它为程序员提供了丰富的运算符来完成各种数学和逻辑运算。

作为一个编程语言中至关重要的部分,了解和掌握C语言的运算符对于程序员来说至关重要。

在本文中,我们将深度解析C语言的34种运算符,包括它们的意义和用法,以帮助读者全面了解这些运算符的特点和功能。

1. 赋值运算符赋值运算符是C语言中最基本的运算符之一,用于将右侧的数值或表达式赋给左侧的变量。

赋值运算符由等号(=)表示,例如:a = 10;将10这个数值赋给变量a。

2. 算术运算符算术运算符用于执行基本的数学运算,包括加法(+)、减法(-)、乘法(*)、除法(/)和求模(%)等。

这些运算符在C语言中十分常见,用于处理数字类型的变量。

3. 自增、自减运算符自增(++)和自减(--)运算符用于增加或减少变量的值,它们可以用作前缀或后缀运算符,分别表示在表达式中先执行运算或者先获取变量的值再执行运算。

4. 关系运算符关系运算符用于比较两个值的大小关系,包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)等。

这些运算符经常用于条件判断和逻辑运算中。

5. 逻辑运算符逻辑运算符用于执行逻辑运算,包括与(&&)、或(||)和非(!)运算。

它们通常用于条件判断和逻辑组合中,能够帮助程序员处理复杂的逻辑关系。

6. 位运算符位运算符用于对整数类型的数值进行位操作,包括按位与(&)、按位或(|)、按位取反(~)、按位异或(^)和左移(<<)、右移(>>)等。

位运算符在处理底层数据操作时十分重要。

7. 条件运算符条件运算符(?:)是C语言中唯一的三目运算符,用于根据条件的真假选择不同的值。

它使得代码更加简洁和可读性更强。

8. sizeof运算符sizeof运算符用于获取数据类型或变量的字节大小,它在编程时经常用于内存分配和操作中。

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

2.sizeof是运算符,strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

sizeof还可以用函数做参数,比如:short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序在编译的时候就把sizeof计算过了,看它是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。

char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果接类型参数必须加括弧,如果是变量名可以不加括弧。

这是因为sizeof是个操作符不是个函数。

8.当适用了于一个结构类型时或变量,sizeof 返回实际的大小,当适用一静态地址空间数组,sizeof 归还全部数组的尺寸。

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

9.数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如:fun(char [8])fun(char [])都等价于 fun(char *)在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。

如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度。

32个关键字在c语言中的含义和作用

32个关键字在c语言中的含义和作用

在C语言中,有很多关键字是程序员需要熟悉和理解的,这些关键字在编写C语言程序时扮演着至关重要的角色。

本文将深度探讨其中32个关键字在C语言中的含义和作用,帮助读者更深入地理解这些关键字的用法和功能。

1. int在C语言中,int是一种数据类型,用来声明整数类型的变量。

它可以存储整数值,范围通常是-xxx到xxx。

2. floatfloat是C语言中的另一种数据类型,用来声明单精度浮点数变量。

它可以存储小数值,通常范围是1.2E-38到3.4E+38。

3. charchar是C语言中的字符类型,用来声明一个字符变量。

它通常用来存储ASCII码中的字符。

4. doubledouble是C语言中的双精度浮点数类型,用来声明双精度浮点数变量。

它可以存储更大范围的小数值,通常范围是2.3E-308到1.7E+308。

5. ifif是C语言中的条件语句,用来根据指定条件执行不同的代码块。

它对程序的流程进行控制,根据条件的真假来决定执行哪一部分代码。

6. elseelse是if语句的补充,用来在条件不满足时执行另一段代码。

它可以用于if语句的后续逻辑判断。

7. whilewhile是C语言中的循环语句,用来重复执行一段代码块,直到指定的条件不再满足为止。

它可以用于处理需要重复执行的任务。

8. forfor是另一种循环语句,通常用于已知循环次数的情况下重复执行一段代码块。

它的结构更加简洁和清晰。

9. dodo-while是C语言中的另一种循环语句,与while的区别在于它先执行一次循环体,再进行条件判断。

它保证循环体至少会执行一次。

10. switchswitch是C语言中的多路分支语句,通过不同的case标签来选择不同的执行路径。

它对多个条件进行判断,并执行相应的代码块。

11. casecase是switch语句中的分支标签,用来指定需要执行的代码块。

它是switch语句的重要组成部分。

12. breakbreak是C语言中的控制语句,用来跳出当前循环或switch语句。

c语言关键字及其含义用法

c语言关键字及其含义用法

c语言关键字及其含义用法C语言关键字及其含义和用法C语言作为一种通用的高级编程语言,具有广泛的应用领域和较高的执行效率。

C语言的灵活性和强大性使得它成为编程界广泛使用的语言之一。

而在C语言中,关键字是指被预先定义并具有特定用途的标识符。

本文将对C语言的关键字进行逐一介绍,并详细解释其含义和用法。

1. auto:auto是一个存储类别关键字,用于定义在函数内部的局部变量,默认情况下,所有在函数内定义的变量都是自动变量。

例如:cvoid func(){auto int num = 10;}2. break:break用于终止当前循环或者switch语句,并跳出该循环或者switch语句的执行体。

例如:cfor(int i=0; i<10; i++){if(i == 5){break;}printf("d\n", i);}3. case:case用于在switch语句中定义每个具体的匹配条件。

例如:cint num = 1;switch(num){case 1:printf("The number is 1.\n");break;case 2:printf("The number is 2.\n");break;default:printf("The number is not 1 or 2.\n");}4. char:char是一种基本数据类型,用于定义字符类型的变量或者函数参数。

例如:cchar ch = 'A';char str[] = "Hello World";5. const:const是一个类型限定符,用于定义常量,一旦定义后,其值就不能被修改。

例如:cconst int num = 10;6. continue:continue用于终止当前循环的剩余代码,并立即开始下一轮循环。

32个关键字在c语言中的含义和作用

32个关键字在c语言中的含义和作用

32个关键字在c语言中的含义和作用【32个关键字在c语言中的含义和作用解析】在C语言中,有一些关键字是非常重要的,它们在程序中扮演着至关重要的角色。

下面,我将对这32个关键字进行深入解析,让我们来一探究竟。

1. #include在C语言中,#include用于包含头文件,使得在当前文件中可以使用所包含文件中的定义。

2. intint是C语言中的一个基本数据类型,代表整数。

3. charchar也是C语言中的一个基本数据类型,代表字符。

4. floatfloat是C语言中的一个基本数据类型,代表单精度浮点数。

5. doubledouble是C语言中的一个基本数据类型,代表双精度浮点数。

6. ifif是C语言中的条件语句,用于进行条件判断。

7. elseelse也是C语言中的条件语句,用于在条件不成立时执行的语句块。

8. switchswitch语句用于多条件判断,可以替代多个if-else语句。

9. case在switch语句中,case用于列举不同的条件分支。

10. default在switch语句中,default用于表示默认的条件分支。

11. forfor循环用于重复执行一个语句块。

12. whilewhile循环也用于重复执行一个语句块,但条件判断在循环之前进行。

13. dodo-while循环会先执行一次循环体,然后再进行条件判断。

14. breakbreak语句用于跳出循环。

15. continuecontinue语句用于结束当前循环,并开始下一次循环。

16. returnreturn语句用于结束函数的执行,并返回一个值。

17. voidvoid用于声明函数的返回类型,表示该函数没有返回值。

18. sizeofsizeof用于获取变量或类型的长度。

19. typedeftypedef用于给数据类型取一个新的名字。

20. structstruct用于定义结构体类型。

21. unionunion也用于定义数据类型,但它和结构体不同,它的所有成员共用一块内存。

c语言中sizeof的用法举例

c语言中sizeof的用法举例

c语言中sizeof的用法举例在C语言中,sizeof是一个用于计算数据类型或变量所占字节数的运算符。

它可以用于计算各种数据类型的大小,包括基本数据类型、数组、结构体和联合体等。

下面是一些使用sizeof运算符的示例:1. 计算基本数据类型的大小:c#include <stdio.h>int main() {printf("int类型的大小为:%zu 字节\n", sizeof(int));printf("float类型的大小为:%zu 字节\n", sizeof(float));printf("char类型的大小为:%zu 字节\n", sizeof(char));printf("double类型的大小为:%zu 字节\n", sizeof(double));return 0;}输出:int类型的大小为:4 字节float类型的大小为:4 字节char类型的大小为:1 字节double类型的大小为:8 字节2. 计算数组的大小:c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);printf("数组的大小为:%d\n", size);return 0;}输出:数组的大小为:53. 计算结构体的大小:c#include <stdio.h>struct Student {char name[20];int age;float score;};int main() {struct Student stu;printf("结构体的大小为:%zu 字节\n", sizeof(stu));return 0;}输出:结构体的大小为:28 字节4. 计算联合体的大小:c#include <stdio.h>union Data {int num;float f;char str[20];};int main() {union Data data;printf("联合体的大小为:%zu 字节\n", sizeof(data));return 0;}输出:联合体的大小为:20 字节5. 计算指针类型的大小:c#include <stdio.h>int main() {int *ptr;printf("指针的大小为:%zu 字节\n", sizeof(ptr));return 0;}输出:指针的大小为:8 字节(在64位系统上)6. 计算自定义类型的大小:c#include <stdio.h>typedef struct {int x;int y;} Point;int main() {Point p;printf("自定义类型的大小为:%zu 字节\n", sizeof(p));return 0;}输出:自定义类型的大小为:8 字节总结:sizeof运算符可以用于计算各种数据类型的大小,包括基本数据类型、数组、结构体、联合体和指针等。

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

2.sizeof是运算符,strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

sizeof还可以用函数做参数,比如:short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序在编译的时候就把sizeof计算过了,看它是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。

char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果接类型参数必须加括弧,如果是变量名可以不加括弧。

这是因为sizeof是个操作符不是个函数。

8.当适用了于一个结构类型时或变量,sizeof 返回实际的大小,当适用一静态地址空间数组,sizeof 归还全部数组的尺寸。

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。

9.数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如:fun(char [8])fun(char [])都等价于 fun(char *)在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。

如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言中的sizeof的理解。

一、sizeof的概念sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。

它并不是函数。

sizeof操作符以字节形式给出了其操作数的存储大小。

操作数可以是一个表达式或括在括号内的类型名。

操作数的存储大小由操作数的类型决定。

二、sizeof的使用方法1、用于数据类型sizeof使用形式:sizeof(type)数据类型必须用括号括住。

如sizeof(int)。

2、用于变量sizeof使用形式:sizeof(var_name)或sizeof var_name变量名可以不用括号括住。

如sizeof(var_name),sizeof var_name等都是正确形式。

带括号的用法更普遍,大多数程序员采用这种形式。

注意:sizeof操作符不能用于函数类型,不完全类型或位字段。

不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

如sizeof(max)若此时变量max定义为int max(),sizeof(char_v)若此时char_v定义为char char_v[MAX]且MAX未知,sizeof(void)都不是正确形式。

三、sizeof的结果sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

1、若操作数具有类型char、unsigned char或signed char,其结果等于1。

ANSI C正式规定字符类型为1字节。

2、int、unsigned int、short int、unsigned short、long int、unsigned long、float、double、long double类型的sizeof在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。

3、当操作数是指针时,sizeof依赖于编译器。

例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。

一般Unix的指针字节数为4。

4、当操作数具有数组类型时,其结果是数组的总字节数。

5、共用体类型操作数的sizeof是其最大字节成员的字节数。

结构类型操作数的sizeof 是这种类型对象的总字节数。

让我们看如下结构:struct{char b;double x;}a;在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9。

这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。

如double类型的结构成员x要放在被4整除的地址。

6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

四、sizeof与其他操作符的关系sizeof的优先级为2级,比/、%等3级运算符优先级高。

它可以与其他操作符一起组成表达式。

如i*sizeof(int);其中i为int类型变量。

五、sizeof的主要用途1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。

例如:void*malloc(size_t size),size_t fread(void*ptr, size_t size, size_t nmemb, FILE*stream)。

2、sizeof的另一个的主要用途是计算数组中元素的个数。

例如:void*memset(void*s, int c, sizeof(s))。

由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof 来代替常量计算。

本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用sizeof来求结构体的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中sizeof的主要用法。

1、sizeof应用在结构体上的情况请看下面的结构:struct MyStruct{double dda1;char dda;int type};对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求:sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。

你知道为什么在VC中会得出这样一个结果吗?其实,这是VC对变量存储的一个特殊处理。

为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。

在默认情况下,VC规定各成员变量存放的起始地址相对于结构体的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

下面列出常用类型的对齐方式(vc6.0,32位系统)。

类型对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)Char偏移量必须为sizeof(char)即1的倍数int偏移量必须为sizeof(int)即4的倍数float偏移量必须为sizeof(float)即4的倍数double偏移量必须为sizeof(double)即8的倍数Short偏移量必须为sizeof(short)即2的倍数各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。

同时VC为了确保结构的大小为结构体的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

下面用前面的例子来说明VC到底怎么样来存放结构的。

struct MyStruct{double dda1;char dda;};为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构体的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构体中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。

所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。

下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:struct MyStruct{char dda;double dda1;int type};这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)为24。

结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。

(简单说明)struct MyStruct{char dda;//偏移量为0,满足对齐方式,dda占用1个字节;double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8//的倍数,需要补足7个字节才能使偏移量变为8(满足对齐//方式),因此VC自动填充7个字节,dda1存放在偏移量为8//的地址上,它占用8个字节。

int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍//数,满足int的对齐方式,所以不需要VC自动填充,type存//放在偏移量为16的地址上,它占用4个字节。

};//所有成员变量都分配了空间,空间总的大小为1+7+8+4=20,不是结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数。

所以该结构总的大小为:sizeof(MyStruc)为1+7+8+4+4=24。

其中总的有7+4=11个字节是VC自动填充的,没有放任何有意义的东西。

VC对结构体的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。

VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。

n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

结构体的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构体的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。

下面举例说明其用法。

#pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐struct test{char m1;double m4;int m3;};#pragma pack(pop)//恢复对齐状态以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。

接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。

接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。

这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n 的倍数。

如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。

(请读者自己分析)2、sizeof用法总结在VC中,sizeof有着许多的用法,而且很容易引起一些错误。

相关文档
最新文档