C语言中数组名的含义

        为了便于讨论数组名的含义,我们先使用C语言来创建一个字符数组。

int main()
{
    char arr[10]=“abcdef”;
    return 0;
}

这样我们就创建好了一个字符数组arr,但是我们在讨论arr含义的时候总是会出现分歧,有时候arr表示数组名,有时候表示首元素地址,我们可以拿下面的例子来简单验证一下。

printf("%s\n",arr);
printf("%d",sizeof(arr));

这时候的运行结果如下图所示:

 因为我们第一条printf是以%s打印的这个时候arr应该是字符‘a’的地址,这样才会从这里开始往后打印,直到找到后面的‘\0’;但是第二条printf结果是10,说明这个时候的arr不是地址,而是代表了整个数组,也就是数组名。

C语言中之后sizeof()和&中引用的数组名表示数组名本身,其他时候都是表示数组首元素的地址,sizeof后面的表达式并不运算,sizeof只会根据括号里内容的类型来计算占用空间大小。这里强调一下,二维数组首元素是二维数组的第一行。

下面的一些例题能够很好的帮我我们理解:

这里按照X86实现,指针大小为4个字节。

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//因为a是由sizeof引用的所以这里的a是数组名,结果是16
printf("%d\n",sizeof(a+0));//这里先进行的是a+0,所以a是首元素地址,a+0还是首元素地址,结果是4
printf("%d\n",sizeof(*a));//这里a先进行解引用,所以a是首元素地址,解引用之后首元素,是int类型,结果是4
printf("%d\n",sizeof(a+1));//这里先进行的a+1,所以a是首元素地址,a+1是第二个元素的地址,所以结果是4
printf("%d\n",sizeof(a[1]));//这里a先进行[]运算,所以a是首元素地址,a[1]等效于*(a+1),所以这里是第二个元素,类型是int,结果是4
printf("%d\n",sizeof(&a));//这里直接&a,所以a是数组名,取出的是数组地址,但数组地址也是地址,结果还是4
printf("%d\n",sizeof(*&a));//这里先&a,取出数组地址,然后解引用得到的是这个数组,所以结果是16
printf("%d\n",sizeof(&a+1));//这里直接&a取出的是数组地址,数组地址+1就是跳过这个数组,具体指向的内容是什么不得而知,但是sizeof只看类型,这里的类型就是一个数组指针int (*)[4];所以结果是4
printf("%d\n",sizeof(&a[0]));//这里先进行的下标引用,所以取地址取出的是下标为0的元素的地址,结果是4
printf("%d\n",sizeof(&a[0]+1));//这里取出了下标为0元素的地址后加1,相当于是第二个元素的地址,结果为4

再增加一点难度:

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//这里arr表示数组名,这个数组里除了abcdef还有'\0',所以结果是7
printf("%d\n", sizeof(arr+0));//这里arr+0,所以表示首元素地址,结果是4
printf("%d\n", sizeof(*arr));//这里*arr,所以arr表示首元素地址,解引用后为首元素为char类型,结果是1
printf("%d\n", sizeof(arr[1]));//这里arr[1]就是下标为1的元素,类型也是char所以结果还是1
printf("%d\n", sizeof(&arr));//这里是&arr所以arr是数组名,取出了arr数组地址,地址的大小是4个字节
printf("%d\n", sizeof(&arr+1));//取地址取出了arr的地址,+1跳过一个数组,还是地址,所以结果还是4
printf("%d\n", sizeof(&arr[0]+1));//这里先下标引用,取地址取出的是下标为0的元素的地址,+1是下标为1元素的地址,结果是4
printf("%d\n", strlen(arr));//这里直接就是arr所以为首元素地址,strlen往后数第7个元素是'\0',所以结果是6
printf("%d\n", strlen(arr+0));//这里和上面一样+0也还是首元素地址,结果还是6
printf("%d\n", strlen(*arr));//这里arr为首元素地址,解引用后是首元素,不是地址,所以error
printf("%d\n", strlen(arr[1]));//这里同理arr[1]不是地址而是下标为1的元素,error
printf("%d\n", strlen(&arr));//这里直接&arr,所以arr是数组地址,但是数组地址和首元素地址相同,strlen不会跳过一个数组,只会一个字符一个字符数,所以结果还是6
printf("%d\n", strlen(&arr+1));//这里&arr+1跳过一整个数组,什么时候出现'\0',我们也不能预测,所以是随机值
printf("%d\n", strlen(&arr[0]+1));//这里arr是首元素地址&arr[0]+1是第下标为1元素的地址,所以结果是5

希望这篇文章可以帮助大家更好的理解数组名和首元素地址的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值