高分悬赏关于指针问题

来源:百度知道 编辑:UC知道 时间:2024/05/22 17:57:14
我按照书上写的
#include "stdio.h"
void f();
void main()
{
int s[4][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},(*ps)[5];
ps=s;
printf("%d\n",ps+2);
printf("%d\n",*(ps+3));
printf("%d\n",ps[0][6]);
printf("%d\n",s[0][6]);
printf("%d\n",*(ps+1)+3);
}
我觉得ps=s;的含义是把整形数组s的首地址给了指针ps,ps本身是一个一级指针,指向数组s的首地址,但是因为s是数组,所以我认为现在的ps已经是一个二级指针了,它指向4个一级指针,4个一级指针分别指向5个具体元素的地址,下面的几个printf语句我认为含义是这样的:
1.printf("%d\n",ps+2);我觉得这个ps+2好像没有实际意义吧,+2之后是不是已经越过这个数组,相当于ps的指针的实际地址+20×4×2的地址吧?
2.printf("%d\n",*(ps+3));应该是ps首地址+20×4×3吧?
3.printf("%d\n",ps[0][6]);按道理说二维最大只能是到4,但是我写了6居然没事,结果是7;不知道是为什么,还有ps[0][6]应该是指针地址啊,如果要输出具体的元素值已经是*ps[0][6]才对啊,但是为什么可以直接写呢?
4.printf("%d\n",s[0][6]);同3一样越界了,怎么能正常输出3?
求高手一定要帮帮我,我知道如果我把这个搞糊涂了之后,我的指针就白学了,求高手一定要指点迷津啊,我上面的分析好像都是错的,但是我不知道为什么啊????<

程序可以等价于下面的这个,我把二维数组的初始化写开了,方便阅读
void main()
{
int s[4][5]=
{{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20}};
int (*ps)[5];

ps=s;
printf("%d\n",ps+2);
printf("%d\n",*(ps+3));
printf("%d\n",ps[0][6]);
printf("%d\n",s[0][6]);
printf("%d\n",*(ps+1)+3);
}

我觉得ps=s;的含义是把整形数组s的首地址给了指针ps,ps本身是一个一级指针,指向数组s的首地址,但是因为s是数组,所以我认为现在的ps已经是一个二级指针了,
:上面这些话,没有错

它指向4个一级指针,4个一级指针分别指向5个具体元素的地址,
:这句话错了,p等同于a,它指向一个拥有5个int型元素的一维数组的首地址

下面的几个printf语句我认为含义是这样的:
1.printf("%d\n",ps+2);我觉得这个ps+2好像没有实际意义吧,+2之后是不是已经越过这个数组,相当于ps的指针的实际地址+20×4×2的地址吧?
:并没有越过这个二维数组,ps+2相当于&a[2];
:ps+2,p实际上向后移动2*5*2个字节

2.printf("%d\n",*(ps+3));应该是ps首地址+20×4×3吧?
:ps+3相当于&a[3];*(ps+3))相当于a[3],它还是一个指针

3.printf("%d\n",ps[0][6]);按道理说二维最大