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

#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]的值呢?

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");

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-03
#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]

本回答被提问者和网友采纳
第2个回答  2011-05-24
因为p[3]没有指向a[0][3],你加条语言
printf("%x\t%x\n", p[3], &(a[0][3]));
就知道了。
第3个回答  2011-05-24
printf("%d",(*p)[3]);
第4个回答  2018-02-03
#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的意思

相似回答