c语言 数组有关问题
c语言 数组问题定义一个数组char a[20]那么&a,a和&a[0]都是什么意义有区别么?求详细解释。谢谢。a是一个指针
c语言 数组问题
定义一个数组char a[20]
那么&a,a和&a[0]都是什么意义有区别么?
求详细解释。谢谢。
a是一个指针,表示这个数组的首地址,即这个指针内存放着的数组第一项的位置;
a[0]指的是第一项,是一个char型,&a[0]就是第一项的位置,故&a[0]与a是同一个意义,表示数组的首地址;
&a指的是这个指针a的地址,即a这个指针所存放的位置的地址,与前两者不一样;
这个对不对?如果对,那么一整形输出时三个的值为什么一样呢?不对求解释。
[解决办法]
C/C++ code#include <stdio.h>int main(void){ char array[20]; char (*p)[20]; p = &array; printf("%p\n", array); printf("%p\n", p); printf("%p\n", &p); return 0;}
[解决办法]
下面的例子可以帮助理解
C/C++ code#include <stdio.h>int main(int argc, char *argv[]){ char a[20]; printf("%p\n", a); printf("%p\n", a + 1); printf("%p\n", &a[0]); printf("%p\n", &a[0] + 1); printf("%p\n", &a); printf("%p\n", &a + 1); return 0;}
[解决办法]
*a
两部动作, &a,然后 *a
所以*a 指的是数组首元素
[解决办法]
首先,数组是一个拓展类型。一个数组对象是一个聚集,同时,它也是一个对象!是一个整体!c语言提供数组到其首元素指针的转换是为了方便写程序,不是说数组名就是XXX,数组名就是一个对象的名字。和其他对象的名字一样,都是一个标识符,用来代表某个对象。
int arr[3];
arr 是数组名,可以隐式转换成首元素的指针,这时元素类型是int,所以可以转换成int*
int* p = arr;//正确.
int*p = &arr[0];//与上面效果一样.
int arr2[3][2];
arr2 是数组名,可以隐式转换成首元素的指针,这时元素类型是int [2];//是一个一维数组.所以可以转换成int(*)[2];//指向数组的指针.
int (*p)[2]=arr2;//正确.
int (*p)[2] = &arr2[0];//与上面效果一样.
对于*arr是怎么理解的?
*arr;//很明显,数组本身是不存在*(解引用)操作的.于是数组转换成首元素的指针,再被解引用.
*(arr + 0)//这样写也是一样的.不过这里是因为加法操作而转换成指针.
实际上,除了在sizeof(),和&操作之外,其他情况都会转换成指针.
你试试:
int arr[3];
sizeof(arr);
int * p = &arr;//错;
int (*P)[3] = &arr;//对/
对于二维数组:
int arr[3][2];
*arr;//这里跟上面一样,转换成首元素指针,于是*arr表示int [2]数组.
试试:sizeof(*arr) == 8;
int (*)[2] = &*arr ;
**arr;//之所以可以这么写是因为上面转换成来的 int [2];数组还可以再次转换成首元素指针.再次被解引用,实际上这样更直观 *(*arr);
数组名绝不不是就是指针.二维数组名更不是就是二维指针,详见我上面的链接....
[解决办法]
http://blog.csdn.net/supermegaboy/article/details/4855027
[解决办法]
a的类型是char (*)[20],
错了, char s[5][20]的 会退化为char(*)[20];
它的类型就是char s[20],最高纬度
[解决办法]
C/C++ codea是数组名, *a 是指向数组的指针,指针指向的是这个数组的首地址。&a 和 &a[0] 也是这个数组的首地址。一个意思。所以值是一样的。
[解决办法]
&a,&a[0]遇到二维数组的时候就有区别了,自己test下 既不大庆了
[解决办法]
[解决办法]
&a 是数组的首地址,即首元素的地址;
a 是数组名;
&a[0] 是元素a[0]的地址,与&a表示相同值;
[解决办法]
&a 是指针数组