关于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当然是成了二唯的指针类型了
补充:软件开发 , C语言 ,