補充內容:C++語言中陣列指標和指標陣列徹底分析 (轉)

gugu99發表於2008-05-12
補充內容:C++語言中陣列指標和指標陣列徹底分析 (轉)[@more@]

上一次我們主要說明陣列,指標,指標陣列,陣列指標這幾個很基本的概念,
不過有一點上一次我沒有提及,那就是我們使用typedef定義指向陣列指標
的陣列,這個叫法是不是很拗口呀,不過我們看具體的就清楚了。

組--------------
int a[2]={10,20};
int b[2]={30,40};
單的指向兩個元素陣列的指標
int (*p2arr)[2]=&a;

意這裡的變化--------

裡我們宣告簡單的型別P2ARR.可以這樣描述
是一種自定義的型別。她的功能描述
用來描述整數陣列的,這個陣列只能含有兩個元素
typedef int (*P2ARR)[2];

P2ARR pp=&b;
pp=p2arr;//型別一致

裡我們定義指向指向陣列指標的陣列
P2ARR ap2a[2]={&a,&b};

果我們採用下面的寫法則是錯誤的,原因看下面分析
ap2a[2]={a,b};//------錯誤寫法-------

---------還有一點注意----------------
有人可以能會說,定義數阻指標的陣列,下面這樣的形式
好像也可以做到的。
int (*p2arr)[2][2];
咋一看,好像是的,但是仔細想想。原來上面是定義
一個指標,這個指標是指向二維陣列的指標,還是
陣列指標,而不是陣列指標陣列。這一點,應該很容易明白的。


上一次我講到int []陣列宣告與int *型別在引數等方面轉換的例子。
這裡有一點補充的,我們實際上現在還是不清楚陣列來C++層面的
表示,也就是我們不知道編譯器使用什麼樣的結構形式來表示陣列的。所以
上面這些轉換隻能轉換而已,我們不能有更多的假設。

----------我的想象,我的猜想--------
我是這樣相像的,C++採用類似中Array類的形式來管理陣列。當然其中
有許多c++語言的特徵,比如operator *,operator ->等過載,但是這些型別
轉換運算子的使用,只有編譯器認為需要的時候才會的,因為陣列表示本身
就是編譯器內部結構的嘛。目前到這裡,我們也只能認為在函式引數使用等情況
下才發生int []到int *的轉換。

看下面的程式。
#include
using namespace std;
void change(int pa[],int index)
{
 pa[index]=200;
}
int main()
{
 int a[3]={1,2,3};
 change(a,0);//這裡編譯器已經把 int a[3],轉換成int *指標傳給了函式
  個是語言實現細節,請參考《the c++ programming language》
 cout< return 0;
}

但是我們上面的標註行
 ap2a[2]={a,b};//------錯誤寫法-------

則是應該這樣理解:陣列就是陣列,指標就是指標,雖然編譯器需要的時候
會進行一定的轉換,但是我們不能認為那些轉換是“想當然“的。
上面這一行,編譯器就沒有為我們進行型別轉換的,所以我們要自己動手了。

// ap2a[2]={&a,&b};//------正確寫法-------

上面這些文字,主要一點就是說明了,有些行為是編譯器完成的,而且還有一些
詭秘。但是我們要知道編譯器做了那些,那些是要完成自己做的。重要的一點,
就是我們學會如何去簡單使用typedef定義型別.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1003889/,如需轉載,請註明出處,否則將追究法律責任。

相關文章