指向多维数组元素的指针变量~麻烦大家指教下

来源:百度知道 编辑:UC知道 时间:2024/07/05 11:45:53
51 用指针变量输出二维数组元素的值
#include<stdio.h>
void main()
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++)
{if((p-a[0])%4==0) printf(“\n”);
printf(“%4d”, *p);
}
printf(“\n”);
}
运行结果如下
1 3 5 7
9 11 13 15
17 19 21 23

我觉得这里(p-a[0])%4==0 (p-a[0两地址]相减以后 为0 然后0%4 ==0 那执行printf(“\n”);
也就是不执行printf(“%4d”, *p); 那么a[0][0] 的元素 1 不就没输出么 ? 这是怎么回事啊? 拜托高手帮忙解释下啊 当执行到a[1][0]-a[0]时两地址相减应该是8 然后8%4==0 就又出现了上面的情况了 这该怎么办呢?
还有一个问题就是 当P自加到a[0]+4时 由于没有a[0][4] 那他会不会自动变成a[1][0]从而指向1行0列的地址么?

有误吧.应该是这样的
for(p=&a[0];p<&a[0]+12;p++)
{
if((p-&a[0])%4==0) printf(“\n”);
printf(“%4d”, *p);
} 楼上说的是.这个循环体是两个顺序执行语句组成的,第一个语句是有条件执行,而第二个语句是无条件执行的.如果把那个条件去掉,则每次输出数据前就要回车换行,结果就是一个纵列了.而不是每四个一行了.不是吗?
关于指针P的问题.它的内容是地址,每加1,就是指针后移一个数据存储空间大小地址.而数组里的数据在内存中是连续存放的.所以不会是你说的那个情况.LZ应该把数据的存储方式弄清楚才好.呵呵.

不是的,"if((p-a[0])%4==0) printf(“\n”); printf(“%4d”, *p);" 这句if语句后并没有括号,所以无论怎样这语句“printf(“%4d”, *p);”都会执行的。