高分悬赏关于指针问题
发布网友
发布时间:2024-01-03 20:01
我来回答
共6个回答
热心网友
时间:2024-08-28 14:48
程序可以等价于下面的这个,我把二维数组的初始化写开了,方便阅读
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]);按道理说二维最大只能是到4,但是我写了6居然没事,结果是7;不知道是为什么,还有ps[0][6]应该是指针地址啊,如果要输出具体的元素值已经是*ps[0][6]才对啊,但是为什么可以直接写呢?
:ps[0]是一个int*类型指针,它可以看出一维数组,元素个数没限制
:例如int a[2],*p=a;我们写p[3]也是可以的,只是它越界了,而ps还没越界
:楼主开始还说ps是二级指针,那么ps[0][6],刚好是个元素了
:*ps[0][6]才对,那ps是三级指针了
4.printf("%d\n",s[0][6]);同3一样越界了,怎么能正常输出3?
求高手一定要帮帮我,我知道如果我把这个搞糊涂了之后,我的指针就白学了,求高手一定要指点迷津啊,我上面的分析好像都是错的,但是我不知道为什么啊????
:同3,s[0][6]=s[1][1]=7
还有指针数组和二维数组指针之间到底是什么区别?
:区别大了
:指针数组,是一个数组啊,数组的元素都是指针
:二维数组指针,是一个指针啊,它指向的数组的地址
热心网友
时间:2024-08-28 14:44
高分呢?这可是很费脑子的~~~
热心网友
时间:2024-08-28 14:49
其实你的理解基本上是正确的,问题在于C编译器是没有越界检查的,因而即使数组越界,程序照样能正常输出,除非越界的地址为其它程序占用了,否则是不会告诉你出错的。
热心网友
时间:2024-08-28 14:45
分不够
热心网友
时间:2024-08-28 14:50
想得来,人家都已经回答了,浪费时间呀
热心网友
时间:2024-08-28 14:51
为了让您的提问被更多人关注,以获得最佳的回答,您可以一次追加悬赏20分以上(含20分),
将问题在分类下的“待解决”问题列表中显示为最新,类似于新提出的问题