Re: [问题] C语言关于阵列位置的问题

楼主: RealJack   2014-05-21 00:09:48
※ 引述《takeabreak2 (小林)》之铭言:
: 大家好
: 小弟这两天才注意到一个问题
: 困扰了很久一直想不通
: int a[5]={0,1,2,3,4};
: printf("%X", a); //印出a的内容:3B241EA0
: printf("\n");
: printf("%X", &a); //印出a的位置:3B241EA0
: printf("\n");
: printf("%d", *a); //印出a所指的位置的内容:0
: 注解是我对程式码的理解
: 如果a的位置和内容相同
: 那a不是指向自己了? *a怎么会是0?
: 大学用C语言写了四年
: 第一次注意到这件事......
我觉得还是要补充一下
array name代表array第一个元素的位置
是compiler自行产生的值,而且是一个不可修改的"左值"
不是右值喔,因为&运算子不可作用于右值,但可以作用于array name
另外要考虑型别
以下语句在C会过但有warning,而在C++会fail
int arr[3];
int (*pa1)[3]=arr; //要改成int (*pa1)[3]=&arr
因为arr是"第一个元素"的位置,第一个元素的型别是int*
故arr的型别也是int*
而&arr的型别是int(*)[3]
&作用于array name时,要考虑array的"整个"型别,而非第一个元素的型别
因为此时arr没被转成pointer,如果arr再被转成pointer,那&arr就变成指标的指标(X)
C不会像C++对型别那么严格,所以只产生warning
也就是说&arr只有值等于arr,型别并没有
再来考虑多维阵列,C/C++没有多维阵列,只有阵列的阵列
int brr[2][3];
int (*pb1)[2][3]=&brr; //指向整个array的指标
int (*pb2)[3] =brr; //指向第一个元素的指标
pb2指向brr的第一个元素,此元素也是阵列=>{1,2,3}
希望对你有帮助,如果有错也请多指教

Links booklink

Contact Us: admin [ a t ] ucptt.com