c语言sizeof运算符的理解和使用


>>返回总目录<<

1 sizeof作用

sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。简单的说其作用就是返回一个对象或者类型所占的内存字节数。

2 sizeof使用形式

  1. 用于基本数据类型
    sizeof (type):其中数据类型必须用()括住,如sizeof(int)。
  2. 用于变量
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

woniudaidai

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值