定义一个数组:
int a[5] = {1, 2, 3, 4, 5};
进行如下操作:
a, &a, &a[0]
1.问:各代表什么?
答:
a 等价于 &a[0] 等价于 第0个元素的地址
&a 等价于 数组a的地址
2.再问:请指出它们之间的实际区别。
答:请看代码:
显示结果是:
&a 和 a 虽然数值一样,但系统在系统看来就是不同的东西了
系统会偷偷地给 &a 标记为:数组的地址
然后给 a 标记为:元素的地址
就像外人分不清双胞胎一样,熟人却可以分清楚哪个是哥哥,哪个是弟弟,因为他们已经在心里默默地给双胞胎标上了记号。
知识拓展:当执行下列操作的时候,会出现什么情况呢?
printf("%d/t%d/n", &a+1, (int*)&a+1);
发现结果和 上一句的一样了!为什么呢?
因为 &a 原本在系统中是被标记为 “数组的地址”,而且经过(int*)强制转换后,变成了 “整型变量的地址”。数组的地址自加,会跨越整个数组,即 4*5 = 20 个字节,而整型变量的地址自加,只能跨越一个整型变量,即 1 个字节.
当然,我们也可以进行 逆向操作。即
(int (*)[5])a+1
看!现在成功地把 a ---“元素的地址”, 转化成了 “数组的地址”,这时它再自加,就不是自加一个整型变量了,而是一整个数组!
注意:(int *[5])a 和 (int (*)[5])a 是不同的!