c语言二维数组用指针表示的问题

#include<stdio.h>voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4];p=... #include <stdio.h>
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int (*p)[4];
p=a;

printf("%d",*(p)[3]);
}
为什么不能正确输出a[0][3]的值呢?
展开
 我来答
fzy范忠云
2011-05-25 · TA获得超过459个赞
知道小有建树答主
回答量:117
采纳率:100%
帮助的人:66.6万
展开全部

ptr=arr;

其实你这样赋值也是可以的,是没有问题的。

因为arr是二维数组的数组名,它(arr)本身就代表这个二维数组的第0行的地址。

问题关键不是出现在这里,而是在你程序的while循环语句中

while(scanf("%f", &ptr+i)&&i!=7)

i++;

你这样写是不对的,首先ptr指向的是一个地址,所以ptr+i也是一个地址,所以这里就不能用变址运算符"&"了。第二个问题是,i 从0自加到6,这里面其实有了7个数,明显超过了arr数组的长度,这样是不对的。这个循环还有一个问题就是,这本身就是一个不正常的循环(自己想想为什么)

下面是我帮你改改的代码,希望对你会有帮助。

#include<stdio.h>

void main()

{

double arr[2][3];

double *ptr;

int i=0;

ptr=*arr;      //把数组arr第0行第0列的地址赋给ptr,其作用与ptr=arr;相同,

                     但不建议采用ptr=arr;这样的赋值//

printf("Plese enter 2*3 numbers: \n");

for(i=0;i<6;i++)

scanf("%lf",ptr+i);   //注意不要将ptr+i 写成&ptr+i 或&(ptr+i),否则出错//

for(i=0;i<6;i++)

printf("%g  ",*ptr++);

printf("\n");

}

百度网友a3722676e
推荐于2018-02-03 · TA获得超过1215个赞
知道小有建树答主
回答量:957
采纳率:0%
帮助的人:857万
展开全部
#include <stdio.h>
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int (*p)[4];
p=a;

printf("%d",*(p)[3]);
}
首先你没有理解int (*p)[4];
他的意思就是含有4个指针的数组 由于int a[3][4]只有3行,所以*(p)[3]这个地方就越界了
如果*(p)[2]地址中的值就是17 *(p)[1] 就是9 ,*(p)[0]就是1
如果你要打印7 *((p)[0]+3)
追问
这个 我的理解是*(p+1)[3]的意思是指针向下移动一行,再向右移动3列,即输出a[1][3]的值。

麻烦列举一下输出这个a[1][3]所有的方法,谢谢。
追答
a[1][3] ========*(p[1]+3)   
p[1]的意思是 取指向第二行的指针 +3的意思就是向后偏移3位就是 你想要的a[1][3]
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
goonthewind
2011-05-24
知道答主
回答量:20
采纳率:0%
帮助的人:17.6万
展开全部
因为p[3]没有指向a[0][3],你加条语言
printf("%x\t%x\n", p[3], &(a[0][3]));
就知道了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ringstar
2011-05-24
知道答主
回答量:8
采纳率:0%
帮助的人:1.3万
展开全部
printf("%d",(*p)[3]);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
swift871102
2018-02-03
知道答主
回答量:2
采纳率:0%
帮助的人:1874
展开全部
#include <stdio.h>

int main()
{
    int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

    int (*p)[4];
    p=a;

    printf("%d",*(*p+2));
    return 0;
}

//你没有理解多维数组a的意思

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式