关于**p这样的指针的问题

来源:百度知道 编辑:UC知道 时间:2024/06/15 15:39:12
int main(int argc, char* argv[])
{
int b;
int a[3][2]={10,20,30,40,50,60};
int (*pw)[2]=a;
printf("**(pw+2),%d\n",**(pw+2));
printf("**pw+2,%d\n",**pw+2);
printf("*(*(pw+2)+1),%d\n",*(*(pw+2)));
printf("*((*pw+2)+1),%d\n",*((*pw+2)+1));
scanf ("%d",&b);
}
显示什么,
为什么,
求教 ^_^

50
12
50
40

pw是指向一维数组的指针,所以
pw+2指向了a[2]的开始,即a[2][0]的地址,不是a[0][2]
**pw是a[0][0]
*(*(pw+2)和**(pw+2)是一样的
*((*pw+2)+1)),先是*pw得到a[0][0]的地址,然后加2加1,得到40的地址,再取*,就是40

int (*pw)[2]=a;
//int (*pw)[2];pw[3] = a[3];
这样就好理解了
pw 指向a第0行的首地址
pw+1 指向a第1行的首地址
pw+2 指向a第2行的首地址
*(pw+2)指向 a第2行第0个元素的地址
**(pw+2) = a[2][0]=50
*(pw+2)+1指向 a第2行第1个元素的地址
*(*(pw+2)+1)= a[2][1] = 60
*pw指向a第0行第0个元素的地址
**pw+2 = a[0][0]+2 =12
*pw+2 指向a第0行第2个元素的地址
因为2维数组在内存中存放方式是按行连续存放的一维数组
所以 第0行第2个元素 就是第1行第0个元素
(*pw+2)+1也就指向第1行第1个元素
*((*pw+2)+1)=a[1][1]=40

50
12
60
40
你第3个printf写错了 应该是:
printf("*(*(pw+2)+1),%d\n",*(*(pw+2)+1));

显示:
**(pw+2),50
**pw+2,12
//原题中,想打印的值是不是写错了?
//我改成了这个:
//printf("*(*(pw+2)+1),%d\n",*(*(pw+2)+1));
*(*(pw+2)+1),60
*((*pw+2)+1),40

a[