c语言一维数组和指针的关系时老师讲“一维数组名是个指针常量,它存放的是一维数组第一个元素的地址”

2024-11-22 00:01:57
推荐回答(2个)
回答1:

首先,你的老师讲“一维数组名是个指针常量,它存放的是一维数组第一个元素的地址”,这个有点问题,数组名本身就代表这个数组的第一个元素的地址,不能说“它存放的是一维数组第一个元素的地址”,a有指针的语法,但它并不是指针,它就代表它本身所处的地址,a就是&a[0],这个地址内存放的是a[0],也就是你放进去的1。

至于&a,这个就有点讲究了,在早期的c语言标准下,这个是不合法的,但是对一个数组取地址不合法有点说不过去啊,所以后来的c标准(具体哪一年不记得了)就允许对数组取地址,但含义不同了,&a在数值上和a以及&a[0]是相同的,但&a的类型是个int(*)[5],是个一维数组指针,相对于a提升了一级

回答2:

printf("%#x\n",&a[0]);
这句话的意思是输出a[0]的地址。
printf ("%#X\n",a);
这句话的意思也是输出a[0]的地址。这里的a并不是表示一个常量,它表示的是一个指向a数组的一个指针,并且是指向数组开始的a[0],C里面把数组当做指针来操作。

而在声明的时候就已经给数组a分配了固定的内存空间,它的每个元素的地址是固定不变的。
至于你的赋值操作对内存地址是没有影响的,它只是把这个值储存到那个地址里的内存空间。

就像,你定了房间,你的门牌号是不变的,不管你放什么东西到房间里,门牌号都不会改变