C语言简单程序。指针

/*Note:YourchoiceisCIDE*/#include"stdio.h"voidmain(){inta[3][3]={0,1,2,3,4,5,6,7,8},*... /* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int a[3][3]={0,1,2,3,4,5,6,7,8},**p;
*p=&a[0];
printf("%d",*(*(p+2)+1));

}这个语句错在哪里?
展开
 我来答
大家好我是大佬eO
2011-11-17 · TA获得超过127个赞
知道答主
回答量:44
采纳率:0%
帮助的人:52.5万
展开全部
*p=&a[0];
这个是错误的,
void main()
{
int a[3][3]={0,1,2,3,4,5,6,7,8}, *p;
p=*a;//把数组的起始地址赋值给p
printf("%d",*(p+2)+1);//*(p+2)得到第三行的第一个元素,即5,*(p+2)+1)就是5+1
//如果想直接将指针定义为代表某一行元素,应该是p=&a[i][0];

}
furious_tauren
2011-11-17 · TA获得超过4057个赞
知道大有可为答主
回答量:1913
采纳率:100%
帮助的人:836万
展开全部
搞什么飞机??

1, *p=&a[0]; // p是个指向指针的指针, *p 是个指针。 这里会出错, 因为p并没有初始话,其值是随机的。 如果p指向的是系统内存, 那么*p 就是系统内存,我们给*p赋值就会发生内存访问错误。
你可以直接p = &a[0]; 也可以把 p声明成 int *p;

2, printf("%d",*(*(p+2) + 1)); // 即使上面正确的把p赋值为数组的首地址,这句错了: p+2指向
a[2], 所以*(p+2)等于2, 因为 p是双层指针, 那么*(p+2)其实就是一个int指针,*(p+2) + 1就是
2 + sizeof(int) * 1等于6. *(*(p+2) + 1)就是*6,很显然地址6是系统内存,引发内存访问错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dwjchdu
2011-11-17 · TA获得超过5915个赞
知道大有可为答主
回答量:4576
采纳率:60%
帮助的人:1210万
展开全部
越界了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kabbin2010
2011-11-17 · 超过13用户采纳过TA的回答
知道答主
回答量:39
采纳率:0%
帮助的人:43.5万
展开全部
int a[3][3]={0,1,2,3,4,5,6,7,8},**p;
*p=&a[0];
这两句改为:
int a[3][3]={0,1,2,3,4,5,6,7,8},(*p)[3];
p=a;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
滴血雄鹰ss
2011-11-17 · TA获得超过1834个赞
知道答主
回答量:33
采纳率:0%
帮助的人:13.8万
展开全部
指针定义不匹配,&a[0]是数组的首地址,是(*)[3]类型的,而你定义的指针是**p,因此类型不一致。可以改一下 试试。
追问
可以再详细点吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
淦海瑶s1
2011-11-17 · TA获得超过3646个赞
知道大有可为答主
回答量:3341
采纳率:100%
帮助的人:826万
展开全部
这里没必要用两层指针的**p
#include "stdio.h"
void main()
{
int a[3][3]={0,1,2,3,4,5,6,7,8},*p;
p=a;
printf("%d",*(*(p+2)+1));
}
这个语句错在哪里?
追问
p=a;不应该是p=&a;吗?
追答
你仔细看看数组哪一章和指针哪一章把,
应该不难理解
数组的名字就可以当指针用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式