C语言数组(8)--- 数组名
  uUWKQE7Avyk4 2023年11月02日 41 0

一.导入

我们先来看一段代码:

#include<stdio.h>
int main(void){
	int arr[10];
	printf("%p\n",arr);
	printf("%p\n",&arr[0]);
	getchar();
	return 0;
}

我们创建了一个数组arr,第一个printf()语句来打印arr这个数组名,第二个printf()语句来打印数组arr首元素的地址,程序运行结果如下:

C语言数组(8)--- 数组名_C语言

我们可以发现两个printf()语句输出的结果是一样的,那么我们就可以得出结论:数组名就是首元素的地址

我们再来看一段代码:

#include<stdio.h>
int main(void){
	int arr[10];
	printf("%p\n",arr);
	printf("%p\n",&arr[0]);
	int n = sizeof(arr);
	printf("n=%d\n",n);
	getchar();
	return 0;
}

既然数组名arr输出的结果是首元素的地址,那么使用sizeof()函数来计算数组arr的大小结果应该是4或者8(取决于编译平台)但是当我们运行程序以后可以发现n的值为40,如图所示:#include<stdio.h>

C语言数组(8)--- 数组名_指针_02

这就与上面的结论产生了冲突,也就是说上面的结论不完全准确,接下来我们就着重来进行一个区分

首先数组名就是数组首元素的地址这句话没错,但是有两个例外

1.使用sizeof()函数的时候(sizeof(数组名))这时候数组名代表整个数组,计算的是整个数组的大小(单位:字节)

2.&数组名(&读作取地址)这里的数组名代表整个数组,这时候取出的是整个数组的地址

为了让我们更好的理解,我们还是用代码来作为演示,代码如下:

int main(void){
	int arr[10];
	printf("%p\n",arr);
	printf("%p\n",&arr[0]);
	printf("%p\n",&arr);
	getchar();
	return 0;
}

前面两个printf()语句对应输出的内容上文已经讲了,着重来看第三个printf()语句,这里的printf()语句将数组arr的地址打印了出来,我们来看程序运行的结果:

C语言数组(8)--- 数组名_数组_03

我们可以发现三个值是一模一样的,但是结果相同不代表他们的性质相同,我们来看下图:

C语言数组(8)--- 数组名_地址_04

其中蓝色箭头和绿色箭头代表的都是数组首元素的地址,所以两者值相同也无可厚非,黑色箭头则代表数组的开始,取出的是整个数组的地址,为了方便我们观察,我们进行一个对比试验,将代码修改成如下形式:

#include<stdio.h>
int main(void){
	int arr[10];
	printf("%p\n",arr);
	printf("%p\n",arr+1);
	printf("------------------\n");
	printf("%p\n",&arr[0]);
	printf("%p\n", &arr[0]+1);
	printf("------------------\n");
	printf("%p\n",&arr);
	printf("%p\n", &arr+1);
	getchar();
	return 0;
}

我们再次编译以上代码就可以发现他们之间的差别了,程序运行结果如下:

C语言数组(8)--- 数组名_地址_05

我们先来看第一段的代码,这里的输出的arr就是首元素的地址,因为其不满足上面讲到的两种特殊情况,第二段代码则一定是输出的arr数组中的首元素地址,所以与第一段代码运行的结果是一样的,当我们对其进行+1后相当于跳过一个元素的地址,由于是整型数组,一个元素占用的大小为4字节,所以+1后的地址比原先的地址大4,如图所示:

C语言数组(8)--- 数组名_C语言_06

但是我们第三段代码+1后则比原先多出了28,注意此时的0x28为16进制(2*16^1+8*16^0),我们换算过来就是差了40,所以这就代表着我们将数组整体往后面移了,如图所示:

C语言数组(8)--- 数组名_地址_07

                                                                                                                    2023/9/1

                                                                                                                     王起舟

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  zLxnEsMLk4BL   2023年11月19日   35   0   0 数组字符串数组名
  gBkHYLY8jvYd   2023年11月19日   27   0   0 #include数组ci
  X5zJxoD00Cah   2023年11月19日   21   0   0 数组单引号字符串
  gBkHYLY8jvYd   2023年12月10日   24   0   0 #include数组i++
uUWKQE7Avyk4