字符数组
sizeof用法
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
运行结果:
解:
printf("%d\n", sizeof(arr)); 6
此时此刻,sizeof(数组名) 计算的是整个数组的大小,这个数组有6个char类型元素,所以大小为6字节
printf("%d\n", sizeof(arr+0)); 4/8
这里的arr表示首元素地址,+0之后还是首元素a的地址,只要是地址,所以大小为4/8字节
printf("%d\n", sizeof(*arr)); 1
arr是首元素地址,对首元素地址解引用,即得到首元素 a ,a是char类型,所以大小为1
printf("%d\n", sizeof(arr[1])); 1
arr[1]表示的就是第二个元素b,大小为1
printf("%d\n", sizeof(&arr)); 4/8
这里&arr取的是整个数组的地址,是地址,所以大小为4/8字节
printf("%d\n", sizeof(&arr+1)); 4/8
&arr是数组的地址,&arr+1是数组的地址+1,虽然相当于跳过了整个数组,但还是一个地址,所以大小还是4/8字节
printf("%d\n", sizeof(&arr[0]+1)); 4/8
&arr[0]是首元素地址,+1后取到的是第二位元素的地址,也就是 b 的地址,大小为4/8字节;
strlen的用法
strlen库函数是什么?请看下图
请看题:
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
解:
printf("%d\n", strlen(arr)); 结果是未知数即随机值
因为arr是首元素地址,strlen函数拿到一个地址,从这个地址一路往后读取计数,直到读到 \0 为止,然鹅在arr这个字符数组里,没有 \0 让其读取,所以它会顺着内存地址一直往后,具体哪个内存单元里存有 \0 是未知的,所以长度结果就是个随机未知数
printf("%d\n", strlen(arr+0)); 结果是随机值
arr是首元素地址,+0后还是首元素地址,情况与上一题同理,结果是随机数
printf("%d\n", strlen(*arr)); 系统报错
*arr是对首元素地址解引用,得到的就是 字符a ,strlen接收到的其实是字符a的ASCII码值97 ,这个97不是一个合法地址,是个野指针,所以这行代码会报错
printf("%d\n", strlen(arr[1])); 系统报错
arr[1]是第二位元素,就是字符 b ,strlen接收到的是字符 b 的ASCII码值98,与上同理,会报错
printf("%d\n", strlen(&arr)); 随机值
&arr取到的是整个数组的地址,它的值实际上等于首元素地址,由于strlen函数的类型是char* ,传过来之后会进行一个类型的隐式转换,地址类型可能会不一样,但是strlen能接收这个地址,即接收到首元素地址并由此往后计数,所以结果也是一个随机值
printf("%d\n", strlen(&arr+1));结果是一个随机值,与strlen(&arr)得到的随机值相差6
&arr是取整个数组的地址,+1是跳过整个数组,拿到的是整个数组之后的地址,所以同理,结果也是一个随机值,只不过这个随机值与strlen(arr)得到的随机值相差6,如图:
printf("%d\n", strlen(&arr[0]+1)); 随机值
&arr[0]是取第一个元素地址,+1是取到第二个元素地址,即从 字符b 开始向后计数,但是不知道 \0 会出现在后边内存的哪个位置,所以结果也是随机数
————————————————
版权声明:本文为CSDN博主「敲代码的布莱恩特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/DerrickWestbrook/article/details/120114553