如下代码所示:
int arr[3][4] = {0};//定义一个二维数组
int (*p)[6] = arr;//定义一个数组指针指向二维数组的首地址arr
printf("--*arr= %x--\n",*arr);
printf("--arr= %x--\n",arr);
printf("--&arr= %x--\n",&arr);
---------------------------------------
输出结果都是
--*arr= 2686640--
--arr= 28feb0--
--&arr= 28feb0--
由此可以看出输出结果相同
第一个问题:如果说数组名就是数组首地址,那么,为什么*arr取出来的还是首地址呢,*和指针结合取得不是指针指向的内容嘛,如果把printf("--*arr= %x--\n",*arr);换成printf("--*arr= %d--\n",*arr);那么输出的结果应该是0才对,但是我试了,结果不是,这个为什么??
第二个问题:arr是首地址,那么&arr输出结果跟首地址一样,作何解释??
那数组指针应该如何指,他既然是指针应该有指向啊,还有,我重点想知道*p为什么此时不是内容而还是地址,还有数组名代表的指针是降了一级的指针是啥意思?
追答基础不行就会有很多疑问,C语言里指针是个比较难的内容,很多书讲解的不够,而且大部分C初学者学习深度不够,达不到入门的水平。我觉得如果学习C语言的人能够把C语言的入门书籍真的学懂是不存在这些基础问题的,这种问题完全是基础不行的表现
追问你说的很对,肯定是基础不行才问的
本回答被网友采纳arr应该是不是地址变量吧,应该是指针常量吧,只是个符号吧,那为什么取二维数组的第一个值还要用*(*arr)呢?
第二个问题已明白
是变量就有存储空间,指针变量指的是存储地址的变量。arr是这个变量的名称(或者你所说的符号),它存储的是一个指向二维数组空间的地址。你这样理解:arr这个符号是12345,12345是个内存地址。在12345地址处的里面存的是数字0。那么*arr也就是*(12345)表示的就是0;如果12345地址处存放的还是个地址为67890,那么*(*(12345))就是内存地址为67890处的数据。
arr存的是首地址,arr[0]存的也是地址,&(arr[0][0]);你可以把以上三个地址输出下看看。