前言:Hello,大家好,我是心跳sy😘,今天我们来总结一下有关sizeof关键字用法以及注意事项,以及一些c语言初学者容易搞混的sizeof与数组、指针相关联的一些内存分配问题。我们一起来看看吧~💞💞💞
sizeof 的作用:计算变量或类型所占内存的空间大小。包括基本数据类型(包括数值类型和字符类型)、数组、结构体、共用体。单位是(字节),会因编译环境的不同而产生不同的计算结果。
👉sizeof关键字易错点
👉首先我们一定要明确的是 sizeof 不是函数,不是函数❗️❗️❗️它是32个关键字中的一员,许多初学者认为 sizeof 后面带了一对括号,就顺理成章的给它戴了顶“函数”的帽子,其实完全不是这样滴!!我们来看下面一个例子就知道啦:
int i = 0;
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(i));
printf("%zd\n", sizeof i);
⭕️我们可以看到——前两个输出是我们经常用的,sizeof(int) 表示计算 int 类型的内存字节数,为4字节,sizeof(i)是计算一个变量所占内存的大小,因为 i 是 int 类型,所以也为4字节。但是第三个例子就有些奇怪了 ❓❗️它没有带括号就直接可以输出,并且和上面两个并无差别!但是如果换做函数的话,就绝对不允许不带后面的括号啦,由此可见——sizeof 绝不是函数而是一个关键字~💞
👉那么有朋友就要问了,既然可以不带括号,那么如果写成 sizeof int 的形式还可以吗❓
printf("%zd", sizeof int);
此时我们写出这样的代码尝试编译一下,可以看到如下结果:
👉可以看到出现了错误,编译器提醒我们是“类型”出现了错误,我们可以这样想:我们已经知道了sizeof 是一个关键字,int 是一个整数数据类型,那么在int 前面加一个关键字算什么呢❓是类型扩展?明显不正确,我们知道 int 前面可以加unsigned、const等关键字,但是 sizeof 是不可以直接加在 int 前的。
🌈我们总结一下——sizeof 关键字在计算变量所占大小时,括号可以省略,而计算类型(如int类型)大小时括号不能省略。所以呢,我们在使用它时,就乖乖的加上括号,不要偷懒哦~✔️
上个知识点介绍完啦,我们来看下一个重点:
⭕️我们来看一个例子,并思考i的值会不会发生变化呢?
int i = 0;
sizeof(i = 1234);
printf("%d", i);
return 0;
输出结果:
👉可以看到i的值并未发生任何改变,sizeof 中的赋值并没有真正的赋进去,当然这里我们要是输出sizeof 的值,可以发现它依然是4,计算的是变量的内存大小,当然我们在这里不是主要强调这一点的~~
⭕️我们来看第二个例子,此时i又会不会改变嘞?
int i = 1;
sizeof(++i);
printf("%zd",i);
输出结果:
👉我们可以看到,即使 sizeof 括号里面的 i 前置自增了,但是也不会影响到最终的 i 的变量,i 依然是1 。
🌈由此,我们总结一下——在使用 sizeof 关键字计算变量内存时,括号内不要有其他运算,此关键词就用作单独计算类型和变量内存大小就行,如果有其他运算不仅不会带来预期赋值或者改变变量的效果,还会给人带来多此一举、完全没有必要的感觉哦~~✔️
👉初学c语言可能遇到的容易搞混的问题:
我们先来看一段代码:
int* p = NULL;
printf("%zd\n", sizeof(p));
printf("%zd\n", sizeof(*p));
int a[100];
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof(a[100]));
printf("%zd\n", sizeof(&a));
printf("%zd\n", sizeof(&a[0]));
思考:我们每一个printf函数输出的值是多少呢❓是不是许多初学c的伙伴们都可能得思考好一阵呢?其实不难,只要我们搞清楚每个式子的含义就可以做到以后遇见就能立即回答出来的速度了!💞我们先来看看输出结果:
怎么样呢?和你心中的答案是否一致呢?我们一起来看看分析过程:
· 对于前面两行输出,我们可以看到代码中定义了一个指针变量p,并初始化为空指针,第一个输出要求计算指针变量的内存大小,也就是指针的内存大小,我们知道在32位系统上指针的内存是4字节 (64位系统是8字节),所以第一行输出为4。第二行计算的是*p的内存大小,我们知道p是所指变量的地址,那么*p就是地址所指的内容,*p的大小就是所指内容的大小,(空指针的内存是内存中编号为0的空间,不可以访问空指针)*p所指内容是int类型的,所以为4字节。
· 对于后面四行输出:我们定义了一个int类型的数组a,数组一共有100个元素,数组下标为0~99,数组名为a,代表数组首元素地址,也就是&a[0]。第一行输出是计算整个数组的内存大小,sizeof(a)得到的就是100*sizeof(int),数组一共100个元素,每个元素都是int类型的,所以输出100*4=400;第二行是计算第一百个元素的内存大小,取决于a的类型,所以为4字节;第三行是取地址a,计算数组的地址的内存字节数,在32位系统下为4字节;第四行计算数组首元素的地址,与数组的地址位置相同,也为4字节。
👉sizeof与strlen函数从的区别与联系:
🌈sizeof和strlen函数都与计算内存大小有关,但是它们的作用是不同的:
⭕️sizeof()是运算符,而strlen()是函数;
⭕️sizeof 计算变量或类型所占内存的空间大小,strlen函数计算字符串中字符的个数;
⭕️sizeof适用于任何类型的数据,而strlen只能用于以字符‘\0’结尾的字符串;
⭕️sizeof也可以计算字符串长度,但是包含计算末尾的‘\0’,而strlen函数计算字符串长度,不包含末尾‘\0’字符。
感谢大家的阅读!!希望本篇文章对各位友友学习c语言有一定的收获💞~,如有任何问题,欢迎各位大佬在评论区随时指出😘😘😘