问题简化一下:定义一个数组INT8U a[4];
然后对它进行强制转换(看官们不用考虑大小端的问题啊),有三种写法:
1,*(INT32U *)a;
2,*(INT32U *)(&a[0]);
3,*(INT32U *)(&a);
请问第3种写法是否正确?我认为是错误的,但是为什么编译和实际运行都没有问题?如果是正确的,该如何理解?
你好,再请教一下,我定义的是一维数组,如何理解(&a)变成二唯数组首地址了呢?是编译器的默认处理吗?
追答a本来就只是一个数组的首地址,不是指针变量,但相当于一唯指针,对它取地址,系统会让为是把这个数组整体当一个元素而得到的指针,这指针首地址没变,而做+1等地址运算时,是直接以整个数组为元素向后移指针的,这种行为就说明它是比这个a多一唯层了
应当是编译器处理的规则,,更且体的归纳如下:
int i; i只是一个0唯的(只有一个元素)
int *p=&i; 此时p可以算是比i多一唯层,也就是可以当作一唯数组,指向0唯元素
int **p2 = &p; 看得出p是或相当于一唯数,而&p却是又多一唯层,属于二唯,指向1唯元素
int ***p3 =&p2; 很明显,对二唯指针取地址得到的是三唯的指针....指向二唯元素
......
数组名和指针的区别在于,数组名是const型指针,不能对指针本身赋值,不能改变指针本身
除此之外两者有区别吗,没有,所以,对于 int a[4]; a是一唯的指针(常量), &a当然是成了二唯的指针类型了
你好,你提到“&a是指向int [4]数组的指针”,我不大理解啊,应该是"&a[0]是指向int [4]数组的指针"才对吧?我的困扰正是在此。
追答a[0]是数组a中的元素,类型是int,取&后的类型当然是一级指针int *
a是长度为4的int数组,&a的类型是指向长度为4的int数组的指针,即int (*)[4]
不好意思,再请教一下,定义a[5]的话为什么sizeof(&a)=4?应该也是5了啊。