C語言中一維指針與二維指針的轉化

首先說個最特殊的指針 void×,這個是當初爲了指針轉化的方便,設立的一個萬能指針。任何指針都能與之轉化。

看兩個定義:typedef int ×t; t a[10];

typedef int t[10] ;   t  *a;

首行先定義了一個整型指針類型,然後在定義了一個整型數組指針類型;後面一行首先定義了一個整型數組,然後定義了一個指向整型數組的指針。總結下兩行代碼,分別用一句代替就是int* a[10]和 int(*a)[10]。當我們使用指向數組的指針的時候,可以與指向函數的指針對比聯想。若是想初始化指向數組的指針,則可以參考下面的例子:

int a[5]= {1,2,3,4,5};

int * pr =(int*) &a;

int (*pr1)[5]=&a;

注意的是&a表示取數組a的首地址,而當數組名作爲右值時,是作爲數組首個元素的地址,這兩種用法是有區別的。上面的例子中,&a+1就表示移動到數組的最後面了,實際上是移動了一整行,然後使用pr來移動行裏面,這樣有點一維指針與二維指針的轉化的意思了,前不久在網上看到了一個關於指針的題目:

int a[5]= {1,2,3,4,5};

int * pr =(int*) (&a+1);

printf("%d\n",*(pr-1));

結果是5,這就是上面說的那個意思,其實這裏的關鍵是要記住一句話,&a表示取數組a的首地址,而當數組名作爲右值時,是作爲數組首個元素的地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章