c语言二维数组用指针表示的问题
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");
}
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]
printf("%x\t%x\n", p[3], &(a[0][3]));
就知道了。
#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的意思