目录
一.前言
二.用sizeof观察字符串数组的变化
代码
运行结果
结果解释
图解
三.用sizeof观察字符数组的变化
代码
注意
运行结果
图解
注意
证明
一.前言
数组名大部分情况下是首元素的地址,只有两种情况除外:
- sizeof(数组名)此时数组名表示整个数组
- &+数组名 此时数组名表示整个数组
二.用sizeof观察字符串数组的变化
代码
#include<stdio.h>
int main()
{
//数组名大部分情况下是首元素的地址,只有两种情况除外:
//1.sizeof(数组名)此时数组名表示整个数组
//2.&+数组名 此时数组名表示整个数组
//字符串数组
char arr[]="abcdef";
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));
}
运行结果
结果解释
- 第一个,sizeof(数组名),这里是计算数组总大小; 单位是字节,所以1*7=7,char类型是一个字节。
- 第二个,4/8 数组名这里表示首元素的值,arr+0还是首元素地址,地址的大小就是4/8个字节,因为我的这个是64位平台所以输出8
- 第三个,1 *arr是首元素,sizeof(*arr)计算首元素的大小
- 第四个,1 arr[1]是第二个元素,sizeof(arr[1])计算的是第二个元素的大小
- 第五个,4/8 &arr虽然是数组的地址,但也是地址,所以是4/8个字节
- 第六个,4/8 &arr+1是跳过整个数组后的地址,但也是地址
- 第七个,4/8 &arr[0]+1第二个元素的地址
图解
三.用sizeof观察字符数组的变化
代码
#include<string.h>
int main()
{
//数组名大部分情况下是首元素的地址,只有两种情况除外:
//1.sizeof(数组名)此时数组名表示整个数组
//2.&+数组名 此时数组名表示整个数组
//字符数组
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));
//printf("%d\n",strlen(arr[1]));
这里向大家解释一下为什么:strlen函数内的参数其实放的是一个地址,它的本质是从第一个地址开始不断+1,一直遇到‘\0’就截止,来计算出在‘\0’,之前一共有多少个字符;而我们看strlen(*arr)和strlen(arr[1]),*arr和arr[1]都是取出了具体的值,所以这种写法是不合法的,程序会报错。
运行结果
图解
注意
这里向大家解释一下为什么是随机值
正如上面说的:strlen函数内的参数其实放的是一个地址,它的本质是从第一个地址开始不断+1,一直遇到‘\0’就截止,来计算出在‘\0’,之前一共有多少个字符;
首先来看strlen(arr)和strlen(arr+0),这里arr代表的是首元素的地址,也就是说strlen函数会从字符‘a’开始往后面找字符‘\0’,但是我们的数组中最后一个是‘f’没有‘\0’,导致使用计算arr字符串时找不到字符串结束标志 ’\0‘,就会在arr申请的那片内存后面一直找下去,找到 ’\0‘ 后输出,此时输出的结果肯定错误的结果。而且结果未知,这就是为什么是随机值,arr+0同理。
再看后面的strlen(&arr)、strlen(&arr+1)、strlen(&arr[0]+1),这里的&arr取的是整个数组的地址,那么随机值的出现跟上述同理,重点解释后面两个的-6和-1的出现:
-6是因为&arr+1,是在&arr后面加了6个字符,所以之前%arr到‘\0’的距离是9,所以就是9-6=3
证明
我又加了一个e字符,这个时候arr数组中就有了7个字符,*arr+1就意味着再&arr的基础上+7,这就是为什么strlen(&arr+1)结果是10-7=3,跟我们分析的是一样的。
-1很好理解是因为&arr[0]取的是第一个元素的的地址,&arr[0]+1就是在原基础上往后移一位,所以是-1