首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

初学者提问-指针的理解

2012-03-04 
菜鸟提问-指针的理解大家好,菜鸟写了以下一段代码,比较指针p和pArr.执行结果,p和pArr的值相等,即pPArr.然

菜鸟提问-指针的理解
大家好,菜鸟写了以下一段代码,比较指针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)这样的变量。

[解决办法]

C/C++ code
#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;  } 

热点排行
Bad Request.