今天也要继续坚持
今天复习C语言了解到不少和她有关的知识,才知道之前对他了解甚少,于是写下博客及时记录自己的所得,与大家分享一下
sizeof是一个关键字而不是函数!是的,他不是函数!!!
原因很简单,函数在调用时后面都会加一个(),这个叫函数调用操作符,但是sizeof在后面接变量时是可以不带括号的
int a = 10;
sizeof a;
sizeof(a);
sizeof的作用是求后面东西所占内存的大小,吗?
非也非也,当操作数是变量时它计算的是变量所占内存空间的大小,但当操作数是一个类型时,他所求的是该类型创建一个变量所占内存大小,例如:
int a = 10;
sizeof a;
sizeof(a);
sizeof(int);
这三个值都是4.
但是要注意,后面跟的是类型时必须加括号。
谈到求大小自然想到了库函数strlen,ok那我们好好比较一下二位。
仅限于在字符数组,字符串中使用,他的原理是从首元素开始,向后找,找到’\
‘\0'为止,然后计算二者之间的元素个数,因此可能发生数组越界。
当操作数是变量时它计算的是变量所占内存空间的大小,但当操作数是一个类型时,他所求的是该类型创建一个变量所占内存大小,单位是字节,不会发生数组越界。他只会关注占用多少空间,至于空间方什么他不在乎。
C语言本身没有规定他的返回值是什么类型,而是留给系统自己决定,可能是unsigned?int,unsigned?long,unsigned?long long,所以C语言创建了一个类型别名,size_t,统一表示其类型,这就增加了代码的可移植性。
ok知道了这个,我们来看一道题
#include<stdio.h>
int main()
{
int a = 0;
a--;
if (a > sizeof(a))
printf("大于");
else if (a < sizeof(a))
printf("小于");
}
你的答案是小于吗,
因为a是-1,二sizeof返回值是4
哈哈,恭喜答错了,
答案是小于,这是因为sizeof返回值是无符号数,二a是有符号数,因此而者进行比较时会发生类型转化,a变为unsigned?int,自然就是大于了.
在来看一道题
#include<stdio.h>
int main()
{
short a = 1;
int b = 2;
printf("%d\n",sizeof(a = b + 1));
printf("%d", b);
}
不卖关子了,答案是2? ?2。
原因是sizeof中的表达式不会发生运算,他在代码进行编译的时候就已经根据表达式的类型确定了返回值,二表达式的运算发生在程序运行期间,由于编译期间已经处理了sizeof,那表达式自然也就不会运算了。
5.关于sizeof后的操作数含有数组名
要知道数组名一般就认为是指针,但有两个特例,一个是&arr,另一个是sizeof(arr),此时他们代表了整个数组,例如:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d", sizeof(arr));
}
结果是40
但如果里面数组名发生运算,例如:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d", sizeof(arr+1));
}
则结果是8或4,此时arr被看作指针,在64位平台指针大小是8个字节,32为平台下是4个
关于这个涉及到对齐数与偏移量,比较复杂
后续我会在出一篇博客专门探讨这个问题。大家可以先自己在csdn找找相关文章了解一下。
ok那么如果觉得有用的话,就点个赞支持一下吧。