这是CSDN 网友发的一个帖子,在回帖的过程中发现自己其实也弄错了
题目如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[3]={1,2,3};
printf("%d/n",&a);
printf("%d",a);
return 0;
}
我想问下 为什么&a 和 a的值会相同
其其实按照我的理解,a是数组的首地址,指向a[0]的,而&a是对它取地址,所以是数组首地址的指针,他们是不一样的。
但是我错了。
下面是CSDN一些网友的比较好的回复:
一。嗯,本来不想回的,但发现个问题
对于int a[3] = { 1, 2, 3 };
a和&a的确是相等的(指向同一个位置),但是其意义是不一样的,a指向的是第0个元素,&a指向的是整个数组.
不好理解的话对a和&a进行++操作就知道了,有兴趣的可以自己写代码看看.
所以本人不太接受对数组名取地址不合法这个说法.
二。在这里我想详细的讨论一下c语言的数组和指针
1. 指针是有类型的, 例如:整型指针, 浮点数指针
2. 除了void型的指针之外,其他的任何指针变量都告诉用户两个信息:一个是地址,另一个是访问方式
3. 在c语言中任何类型的指针都可以强制转化成其他任何类型的指针,所谓的指针的强制转换 只是转换了指针的
访问方式
[结论] 因此确切的说:a其实不能说是数组的地址,a和&a[0]是等价的, 他是a[0]的地址
&a才是数组的地址
a和&a他们的大小是一样的, 但他们的访问方式不一样
例如: int a[3]
a代表的是 &a[0]他的类型是 int型的占四个字节
&a代表的是 数组的地址 , 他是 int[3]数组类型的, 占12个字节
所以在进行指针运算的时候,a是以四个字节为单位的, 而&a是以12个字节为单位的,例如:
a+3的地址值与&a+1的地址值大小是一样的, 但他们的访问方式不一样...