也谈数组a与&a
今天做了一个题目:
1 #include <stdio.h>
2 int main()
3 {
4 int a[5] = {1,2,3,4,5};
5 int *ptr = (int*)(&a+1);
6 printf("%d %d" , *(a+1), *(ptr-1) );
7 }
2 int main()
3 {
4 int a[5] = {1,2,3,4,5};
5 int *ptr = (int*)(&a+1);
6 printf("%d %d" , *(a+1), *(ptr-1) );
7 }
大家可以试下,看下答案是否和自己想的一样。
这题的关键是理解a和&a的区别。
a是指向int类型的常量指针。
&a则是指向int [5]的一个指针。相当于int (*p)[5] = &a;
如果你想这样定义的话int *p = &a;
这时VC编译器会提示一个WARNING:'int *' differs in levels of indirection from 'int (*)[5]',也就是说类型不匹配
这道题取得了一个不存在的地址(&a+1)之后,然后强制类型转化为(int *),于是*(p-1)便指向了a的最后一个元素。
有什么不对的地方请大家指正!
-------------踏着落叶,追寻着我的梦想