sizeof解析式分析

发布时间 2023-07-20 19:36:00作者: BigBig飞

sizeof

类型:

sizeof()是表达式不是函数

用处:

可以用来求变量 、数组、对象、结构体等所占空间的大小,其实只要将sizeof()操作的参数理解成类型

混淆点:

sizeof() 和 数组
        只有两种情况下数组名可以表示整个数组:

(1)sizeof(数组名):此处数组名不能修饰,否则表示数组首元素的地址

(2)&数组名

其他时候像数组名单独使用,或者是sizeof内部谁数组名相关表达式都表示的是数组首元素的地址。

整型数组:
 int a[] = { 1, 2, 3, 4 }; 
 printf("%d\n", sizeof(a));//16:a数组名单独使用表示整个数组,由于每个元素是int类型,所以结果为4*4=16 
 printf("%d\n", sizeof(a+0));//4:数组首元素的地址的大小 
 printf("%d\n", sizeof(*a));//4:数组第0个元素的大小(int类型的) 
 printf("%d\n", sizeof(a+1));//4:数组第1个元素的大小 
 printf("%d\n", sizeof(a[1]));//4:数组第1个元素的大小 
 printf("%d\n", sizeof(&a));//4(数组首元素的地址) 
 printf("%d\n", sizeof(&a+1));//4(第1个元素的地址) 
 printf("%d\n", sizeof(&a[0]));//4(第0个元素的地址) 
 printf("%d\n", sizeof(&a[0]+1));//4(第1个元素的地址)
sizeof和字符数组:
char a[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(a));//6:求的是整个数组的大小,由于每个元素大小是1,所以结果是6
printf("%d\n", sizeof(a + 0));//4:求的是数组首元素的地址
printf("%d\n", sizeof(*a));//1:求的是第0个元素的大小
printf("%d\n", sizeof(a + 1));//4:求的是第1个元素的地址
printf("%d\n", sizeof(a[1]));//1:求的是第一个元素的大小
printf("%d\n", sizeof(&a));//4(数组首元素的地址)
printf("%d\n", sizeof(&a + 1));//4(第1个元素的地址)
printf("%d\n", sizeof(&a[0]));//4(第0个元素的地址)
printf("%d\n", sizeof(&a[0] + 1));//4(第一个元素的地址)
sizeof和字符串
char* p = "abcdef";
printf("%d\n", sizeof(p));//4   8:对指针变量求sizeof,32位机器在下是4,64位机器下是8如果是char p[]="abcdef";那么结果就是7,要包含'\0'
printf("%d\n", sizeof(p+1));//4   8:指针变量+1跳过一个指向的对象,指指向b结果不变,仍然是指针
printf("%d\n", sizeof(*p));//1 :相当于sizeof('a')自然是1
printf("%d\n", sizeof(p[0]));//1:同上
printf("%d\n", sizeof(&p));//4 8 :&p相当于第0个元素的地址(机器不同大小也不同)
printf("%d\n", sizeof(&p+1));//4 8:第1个元素的地址
printf("%d\n", sizeof(&p[0]+1));//4 8:第一个元素的地址
sizeof和二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48:单独使用数组名,要理解成整个数组,数组存储是{{0,0,0,0},{0,0,0,0},{0,0,0,0}}所以12*4=48
printf("%d\n", sizeof(a[0][0]));//4:数组中第一个元素的大小,所以是4
printf("%d\n", sizeof(a[0]));//16:数组第0行的大小,内部包含四个元素
printf("%d\n", sizeof(a[0]+1));//4:a[0]+1=a[0][1]是一个元素
printf("%d\n", sizeof(a+1));//4:第1行的地址
printf("%d\n", sizeof(&a[0]+1));//4:第一行的地址
printf("%d\n", sizeof(*a));//16:如果是一维数组表示第一个元素,二维数组表示第0行元素
printf("%d\n", sizeof(a[3]));//16:
strlen:

返回C风格字符串的长度,特殊的也可以求字符数组的长度

字符数组和strlen

字符串两种定义方式:

1、char* str="abcdfe";
2、char str[]="abcdfe";

要区别字符数组和字符串和字符串第二种定义方式的区别

字符串如果写成字符数组应该是,char str[]={'a','b','c','d','f','e','\0'};

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(arr));//随机数(strlen再求字符串的长度的时候是以'\0'作为结束标志的,此处没有'\0'自然就是随机数了
printf("%d\n", strlen(arr+0));//随机数和上面结果相同但是意义不同,上面纯粹是求字符数组的长度,下面是从第一个元素a开始求之后的长度
printf("%d\n", strlen(*arr));//出错(此处他把*arr='a'(97当做起始地址去找,但是这块地址是不能访问的)
printf("%d\n", strlen(arr[1]));//出错:类型问题(地址是常量)
printf("%d\n", strlen(&arr));//出错:类型问题
printf("%d\n", strlen(&arr+1));//出错;类型问题
printf("%d\n", strlen(&arr[0]+1));//随机数-1(是从b开始向后求长度)
strlen和字符串
char* p = "abcdef";
printf("%d\n", strlen(p));//6:p指向字符串开始的位置,strlen就从指向的位置往下计数,遇到'\0'才停止   
printf("%d\n", strlen(p+1));//5:p+1,实际上加得是指向对象的大小,所以指向b,从b向后数遇到'\0'停止。
printf("%d\n", strlen(*p));//出错
printf("%d\n", strlen(p[0]));//出错
printf("%d\n", strlen(&p));//出错
printf("%d\n", strlen(&p+1));//出错
printf("%d\n", strlen(&p[0]+1));//5:p[0]就是首元素a,在&操作后就是a的地址,+1,就指向了b,从b向后计算长度

————————————————
参考原文链接:https://blog.csdn.net/cx2479750196/article/details/81288989