今天在看到typedef int (*int_arry)[10];这条语句时,因为对这样的定义使用较少,就想着编写一个test.c来试试看。不过,当我编写完一个简单的测试程序时,却发现我对指向一维数组的指针的使用了解甚少。
起初,我的程序是这样:
#include < stdio.h > typedef int (*int_array)[10]; int main() { int a[10]={1,2,3,4,5}; int_array i=&a; printf("%d=%d\n",i[4],a[4]); return 0; }
编译后,提示如下错误:
test.c: In function ‘main’: test.c:10: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’
也就是说,i[4]是一个int*型的指针。为什么会出现这样的错误?既然i是一个指向有10个整形元素数组的指针。那么将i指向数组a,然后使用i[4]获取第四个元素有什么错?
那我们从另一个角度来分析,一般i[4]这样的形式都可以看成*(i+4)这样的形式。i+4是什么?对了!i是一个数组指针,那么i+4也就是一个数组指针。如果将i所指的数组看作一个二维表的第1行,那么i+4就是指向第5行的指针。也就是说它相对于i所指向位置的偏移量为4*sizeof(int)*10个字节。因此*(i+4)仍然是一个指针,只不过它指向第5行的首个元素。
看来我们找到问题所在,i[4]并不是一个整形元素,而是一个指向整形元素的指针。上面程序中,我原本的意思是通过i来打印数组a中第四个元素。那么此刻我们应该这么修改:
printf("%d=%d\n",i[0][4],a[4]);
或者下面任意一句:
printf("%d=%d\n",(*(i+0))[4],a[4]); printf("%d=%d\n",*(i[0]+4),a[4]); printf("%d=%d\n",*(*(i+0)+4),a[4]);
你会发现,如果p是一个指向指针的指针,那么总能够通过两次的*、两次的[]或者一次*和一次[]取得这个指针最终指向的数据,因为说到底[]总能够化成*的形式。理解了这些,上面的语句对你也就不成问题了。got it?
hi
[回复一下]
edsionte 回复:
10月 31st, 2010 at 11:05
@kongove, hi~
[回复一下]
this is good men
[回复一下]