关于C语言中对数组取址的问题

关于C语言中对数组取址的问题,详见补充:  
如下:
定义一个数组INT8U a[4];然后对它进行强制转换(暂时不用考虑大小端的问题啊),有三种写法:
1,*(INT32U *)a;
2,*(INT32U *)(&a[0]);
3,*(INT32U *)(&a);
请问第3种写法是否正确?我认为是错误的,但是为什么编译和实际运行都没有问题?如果是正确的,该如何理解?
 解答:
 (a)        是一维数组首地址,
(&a[0])  还是一唯数组首地址 与(a)等价
(&a)      二唯数组首地址,其一唯的宽度就是数组a的元素个数首地址值是相同的,而你都做了强制转换,所以看不出差别
如果用以下方法,就可以看出差别了
printf("%x ", (void *)(a+1) );        //==&a[1]
printf("%x ", (void *)(&a[0]+1) ); //==&a[1]
printf("%x ", (void *)(&a+1)  );    //==&a[sizeof(a)+1]

追问,我定义的是一维数组,如何理解(&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当然是成了二唯的指针类型了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值