菜鸟提问-指针的理解
大家好,菜鸟写了以下一段代码,比较指针p和pArr.
执行结果,p和pArr的值相等,即p=PArr.
然而根据推理,
因为 p = calender+1;
pArr = *(calender+1)
所以 pArr = *p
又因为根据编译结果,p=pArr;
所以 p=*p;
这个结论岂不是很谬误,大家能解释这是为什么吗?
================================================================
#include <stdio.h>
main(){
int calender[12][31]={0};
int *p = 0 ;
int *pArr = 0;
p = calender+1;
pArr = *(calender+1);
printf("%d\n",p);
printf("%d\n",pArr);
return 0;
}
[解决办法]
p = calender+1;
P指向第二行的首地址,calender[1][0]存放的值是0
pArr = *(calender+1);
*(calender+1)相当于*(calender[1][0]),PArr指向的是数字"0"的地址.
最后,
printf("%d\n",p);
printf("%d\n",pArr);
输出的结果是相等的,但是两个指针指向的是不同的地址
PS:好久没写C了,如果有误谢谢大家指出来
[解决办法]
calender是个二维数组。
calender+1中的“1”代表跨越一整行数组元素所占据的字节数(楼主举的例子中为sizeof(int)*31),它表示数组第二行的存储首地址。
*(calender+1)也是表示数组第二行的存储首地址。
二维数组中引入的*(calender+1)是个并不占据内存单元的地址常量,它与数组名代表数组的存储首地址完全一样,仅代表一种地址的计算方法,因此不能把calender+1简单地理解为*(calender+1)的物理存储地址,因为在二维数组中并不存在*(calender+1)这样的变量。
[解决办法]
#include<stdio.h> int main(){ int calender[12][31]={0}; int *p=0; int *pArr=0; // 我认为是相等的地址啊。首先这是一个数组的数组,如果为引用第二个数组中的一个数的形 // 式,那么应该是这样的:*(*(calender+i)+j) 这个应该没有问题吧。你可以赋个值试一下就知道了。 p=calender+1; // 这里的calender是第一层的数组(因为其为数组的数组),+1后就指向了第一层数组的第一个元素即calender[1][0] pArr=*(calender+1); // 这个完全是这个中的一部分:*(*(calender+i)+j),即也是指向calender[1][0]的。 printf("%d\n",p); printf("%d\n",pArr); system("pause"); return 0; } //另外,你可以用这个程序来理解。#include<stdio.h> int main(){ int calender[2][2]={1,2,3,4}; int *p=0 ; int *pArr=0; p=calender+1; pArr=*(calender+1); printf("%d\n",*p); printf("%d\n",*pArr); printf("%d\n",*(*(calender+1)+0)); system("pause"); return 0; }