bake off:关于一组C语言指针的问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/28 14:24:20
大家好!请问谁知道下面的程序:
#include<stdio.h>

#define PF "%d,%d,%d,%d,%d,\n"

main(){

static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

printf(PF,a,*a,a[0],&a[0],&a[0][0]);

printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);

printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);

printf("%d,%d\n",a[1]+1,*(a+1)+1);

printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
}
运行结果是
148,3138,148,3138
156,3138,156,3138
164,3138,164,3138
5,5
不理解为什么会是这样的结果呢?
我用的是Mytc编写的。

楼主提供的运行结果是有错误的哈,至少前三行应该是每行五个数的。
实际上,前三行都是地址,其值会是随机的,因为每次运行程序的时候不能保证都分配到相同的地址!理解这个问题首先要弄清楚元素的地址和元素的值的区别,下面我用几个例子来给你讲解。
注意一下几个等式:
值 地址
一维 a[i] = *(a+i) &a[i] = a+i;
二维 *(a[i]+j)=*(*(a+i)+j) a[i]+j=*(a+i)+j;
另外,其实在二维里面可以把其中的较低的一维看作较高的一维的一个元素,这样的话,关于值和地址的一些等式就可以递归的来表示了,前提是弄懂了一维和二维的情况。比如,在二维的时候,把每一行看作一个元素,那么a[i]就是表示的第i行,这样就降低了一维,然后我们把a[i]带入*(a+i),用a[i]代替a便得到了二维的表示,即:*(a[i] + j)。思路是降维!

建议你看一下数组的内容,具体我已经忘了,但相信看看书就会明白的