文章目录
- 1 sizeof作用
- 2 sizeof使用形式
- 3 sizeof使用示例
- 3.1 基本数据类型
- 3.2 变量
- 3.3 指针变量
- 3.4 数组
- 3.5 结构体
- 3.6 联合体
>>返回总目录<<
1 sizeof作用
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。简单的说其作用就是返回一个对象或者类型所占的内存字节数。
2 sizeof使用形式
- 用于基本数据类型
sizeof (type):其中数据类型必须用()括住,如sizeof(int)。 - 用于变量
sizeof (var_name)或sizeof var_name:变量名可以不使用(),如sizeof (var_name)。
3 sizeof使用示例
3.1 基本数据类型
printf("len_int = %d, len_short = %d, len_double = %d, len_char = %d",
sizeof(int), sizeof(short), sizeof(double), sizeof(char));
//输出:len_int = 4, len_short = 2, len_double = 8, len_char = 1
3.2 变量
int a = 10;
short b = 20;
double c = 9999.99;
char d = 'a';
int e[3] = {1,2,3};
int f[] = {1,2,3};
char g[] = {'a','b','c'};printf("a = %d, b = %d, c = %d, d = %d, e = %d, f = %d, g = %d",
sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e), sizeof(f), sizeof(g));
//输出:a = 4, b = 2, c = 8, d = 1, e = 12, f = 12, g = 3
3.3 指针变量
指针变量是用来存放变量地址的,等于地址总线宽度,32位计算机中,指针变量返回值一定是4,64位返回8,注意指针变量sizeof返回值与指针所指数据类型没有关系。
int a = 10;
short b = 20;
double c = 9999.99;
char d = 'a';printf("sizeof(&a) = %d, sizeof(&b) = %d, sizeof(&c) = %d, sizeof(&d) = %d",
sizeof(&a), sizeof(&b), sizeof(&c), sizeof(&d));
//输出:sizeof(&a) = 8, sizeof(&b) = 8, sizeof(&c) = 8, sizeof(&d) = 8
3.4 数组
char a1[] = "abcde";
int a2[6];
printf("sizeof(a1) = %d, sizeof(a2) = %d", sizeof(a1), sizeof(a2));
//输出:sizeof(a1) = 6, sizeof(a2) = 24
可以通过sizeof计算数组长度,用下面的形式:
int len1 = sizeof (a1) / sizeof (char); /* 总长度/单个元素的长度 */
int len2 = sizeof (a1) / sizeof (a1[0]); /* 总长度/第一个元素的长度 */
另外注意通过下面的方式,实际返回的是指针变量的字节数。
void function(char a[2])
{/* 这里函数参数a已不再是数组类型,而是蜕变成指针,相当于char* a3,调用函此函数时,程序不会在栈上分配一个大小为2的数组,数组是“传址”的,调用者只需将实参的地址传递过去,所以a自然为指针类型(char*)。*/printf("sizeof(a) = %d", sizeof(a));
}int main()
{char a1[] = "ab";function(a1);return 0;
}
//输出:sizeof(a) = 8
3.5 结构体
在下面示例中,输出结果是8而不是5,因为涉及到字节对齐的知识,根据计算机基本原理,有助于加快计算机的取数速度,否则就得多花指令周期,因此编译器默认对结构体进行处理,让宽度为2字节的基本数据类型(如short)都位于能被2整除的地址上,宽度为4字节的基本数据类型(如int)都位于能被4整除的地址上,这样两个数中间就可能需要加入填充字节,整个结构体的sizeof值就增加了。
struct Struct1
{char c;int i;
}Struct1Val;int main()
{printf("sizeof(Struct1Val) = %d", sizeof(Struct1Val));return 0;
}
//输出:sizeof(Struct1Val) = 8
在实际开发中,一般通过结构体存放一组配置,多组配置存放在结构体数组中,可能根据需求增删数组元素,在定义数组时不要固定数组长度,通过sizeof方式可以自动计算数组长度,在需求变更时,只需要增删数组元素,而不需要在其它地方再做更改。
typedef struct
{char Name;int ID;int Gender;
}My_Struct;My_Struct My_StructList[] =
{/* 需求变更时,只需要在此增删数组元素,其它地方不需更改 */{'A', 1, 0},{'B', 2, 1},{'C', 3, 0},{'D', 4, 1},
};int main()
{int i = 0;for(i = 0; i < sizeof(My_StructList)/sizeof(My_Struct); i++){printf("ID = %d, ", My_StructList[i].ID);}return 0;
}
//输出:ID = 1, ID = 2, ID = 3, ID = 4,
3.6 联合体
结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个
联合体的sizeof也就是每个成员sizeof的最大值。
union U
{int i;char c;
}unionVar;int main()
{printf("sizeof(unionVar) = %d", sizeof(unionVar));return 0;
}
//输出:sizeof(unionVar) = 4