首先我們介紹多維陣列
對於二維陣列a[4][6];由於陣列名代表陣列的起始位址,所以a(第一層)和第乙個元素a[0][0]位址的數字是相同的,但是意義卻是不同的。 對於該陣列我們可以理解為:a的一維陣列(第一層),它有四個元素a[0]、a[1]、a[2]、a[3](第二層),而每個元素又含有6個元素a[0] [0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5](第三層),…到此我們終於訪問到了每個元素了,這個過程我們 經歷了:a->a[0]->a[0][0];
整體來講:a是乙個4行6列的二維陣列,a表示它指向的陣列的首位址(第乙個元素位址&a[0]),同時a[0]指向一行,它是這個行的名字 (和該行的第乙個元素的首位址相同(第乙個元素為位址&a[0][0]))。所以從數字角度說:a、a[0]、&a[0][0]是相同 的,但是他們所處的層次是不同的。
既然a代表二維陣列,那麼a+i就表示它的第i+1個元素*(a+i)的位址,而在二維陣列中
*(a+i)又指向乙個陣列,*(a+i)+j表示這個陣列的第j+1個元素的位址,所以要訪問這個元素可以使用 *(*(a+i)+j)(也就是a[i][j])。
總結一下就是:我們對於二維指標a,他指向陣列a[0,1,2,3],使用*,可以使他降級到第二層次,這樣*a就指向了第乙個真正的陣列。對於其他的情況我們也可以採用相同的方式,對於其他維數和型別的陣列我們可以採用相類似的思想。
說到指向陣列的指標,我們還可以宣告乙個指標變數讓它指向乙個陣列。例如:
int (*p)[5];這時p就是乙個指標,要指向乙個含有5個int型別元素的陣列,指向其他的就會出現問題。這個時候我們可以使用上面的什麼東西來初始化呢?我們可以使用*a,*(a+1),a[2]等。原因很簡單:我們在乙個二維的陣列中,那麼表達方式有上面的相互類似的意義呢?只有 *a,*(a+1),a[2]等。
陣列指標(行指標)
定義 int (*p)[n];
()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
如要將二維陣列賦給一指標,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,數值上等於a[0]或&a[0][0],但是執行p++操作的時候,指標跨過的長度卻不一樣
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
定義 int *p[n];
優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數位址。但可以這樣 *p=a; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。
如要將二維陣列賦給一指標陣列:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2]
所以要分別賦值。
乙個指標陣列是指乙個陣列中的每個元素都是乙個指標,例如:
int *p[10];//而不能是int (*p)[10]
這樣兩者的區別就豁然開朗了,陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。
還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。
比如要表示陣列中i行j列乙個元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
優先順序:()>>*
指標的指標(二重指標)(二級指標)
乙個指標變數內部可以儲存乙個值,這個值是另外乙個物件的位址,所以我們說乙個指標變數可以指向乙個普通變數,同樣這個指標變數也有乙個位址,也就是 說有乙個東西可以指向這個指標變數,然後再通過這個指標變數指向這個物件。那麼如何來指向這個指標變數呢?由於指標變數本身已經是乙個指標了(右值),那 麼我們這裡就不能用一般的指標了,需要在指標上體現出來這些特點,我們需要定義指標的指標(二重指標)。
int *p1=&i;綜合以上的所有點,下面是我們常常看到一些匹配(也是經常出錯的地方):int**p2=&p1;
int a[3],b[2][3],c,*d[3];void fun1(int *p);
void fun2(int (*p)[3]);
void fun3(int **p);
void fun4(int p[3]);
void fun5(int p);
void fun6(int p[2][3]);
void fun7(int (&p)[3]);
函式不會產生編譯時刻的可能值(但邏輯上不一定都對)
fun1
a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun2
b,b+i,
fun3
dfun4
a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun5
a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]
fun6
bfun7
a為什麼可以有這樣的搭配,原因如下:
C 基礎之陣列
由於陣列是資料的集合,所以陣列的型別就是資料的型別。他們分別是int double decimal char string bool第一種int nums new int 10 長度為10,索引為0 9 int型別第二種int nums new int 此陣列就能存5個值第三種int nums ne...
C 基礎之陣列
陣列 arrays 是在記憶體中連續儲存的一組同種資料型別的元素 變數 每一陣列有乙個唯一名稱,通過在名稱後面加索引 index 的方式可以引用它的每乙個元素。也就是說,例如我們有5個整型數值需要儲存,但我們不需要定義5個不同的變數名稱,而是用乙個陣列 array 來儲存這5個不同的數值。注意陣列中...
C語言基礎之陣列
在c語言中,陣列屬於構造資料類。陣列元素可以是基本資料型別也可以是構造型別。一維陣列定義 型別識別符號 陣列名 常量表示式 例 int a 10 下標從0開始 陣列元素的表示式為 陣列名 下標 下標可以是整型常量或者表示式 陣列元素初始化 1.在定義陣列時賦初值 例 int a 10 2.給陣列部分...