二維陣列名是不是「指標」,二維陣列名是不是一個「指標」?

2021-03-11 08:13:18 字數 5997 閱讀 8778

1樓:匿名使用者

理解一復:陣列名就是地址制常量,

地址常量就是不能更改的地址,一旦定義了一個陣列就定了

指標是變數,這是和陣列本質的區別,他可以令他隨意等於任何一個有效的地址

理解二:個人認為陣列名不佔空間,就是個標誌,名字,和人名一樣, 人名不佔空間,

a=5;a作為左值,實際就是一個地址,在c語言中,廣義的說,任何名字(包括函式 名)都是地址,但他們本身不佔空間,他們恰恰是空間的名字,他們裡面的具體內容佔用才是佔用空間的,就和你家房子可以說多大面積的,我能說你家地址佔多大面積嗎

一句話:陣列名是地址,指標是存放地址的容器,所以你可以把陣列名扔到指標裡

總結:只有能放東西的容器才佔空間,不能放東西名字都是浮雲

2樓:匿名使用者

1,無論是一636f707962616964757a686964616f31333264646463維,二維或n維陣列,陣列名就是一個指標常量,它代表陣列元素在記憶體中的首地址。

2,二維陣列名不佔儲存空間的,如1,陣列名只是一個指標常量,打個比方,你的名字指向你這個人,但是你的名字就是人嗎?顯然不是。陣列名也是這個意思。

對於你的提問中:

在程式裡,所有陣列都必須是先定義好再使用,也即是說在編譯之前,每個訪問陣列的地方都已經確定了,或者說每個需要出現陣列名的地方都已經出現了陣列名了

這句話是有問題的,只有靜態陣列的儲存空間和區域是確定的,而動態陣列的儲存空間和區域是不確定的,只是在使用陣列前必須定義它的型別,到底是char or int 等等。

對於標籤一說,還不如就把陣列名當做指標常量來理解呢。你記住,陣列名就代表了一個元素首地址。就是一個指標常量。

你也可以自己程式設計驗證嘛,一個很簡單的程式:

#include

void main()

;printf("%d\n",a);

printf("%d\n",&a[0]);

}程式第一行輸出的就是陣列a的首地址

第二行輸出的是a[0]的地址

但是兩個值是一樣的。

說明陣列名就是代表陣列的首地址,這是確確實實存在的。希望能幫助你。

3樓:匿名使用者

二維陣列名是一個指標,但是說它是常量的意思是它本身不可更改:如內你定義int a[34][3],a確實是個

容指標,*a指向陣列中第一個整數;但是你不能通過a++操作使在此操作後a指向陣列中第二個整數,而普通指標(int a[12];int *b=a;b 就是普通指標)可以這麼操作的,所以說它是「指標常量」;

如果你站在編譯器的層次看待陣列名,指標名確實是不佔據記憶體的,不信你可以寫程式測試一下,一個陣列名american 和 a 經過編譯後生成的exe程式一個位元組都不相差。這是因為編譯器把它替換成了特殊的標誌,但是本質上講是這樣的:你int a[2]定義一個陣列,編譯器會分配給你兩個int的空間,編譯器會把你在任何時刻對這兩個位元組的訪問 編譯成你對相應記憶體單元的訪問。

4樓:小飛花兒的憂傷

陣列名只是一段連續空間的名字,跟指標完全不一樣。

它不能被改變,誰會去給一個名字加1。

它在值傳遞時傳的是首元素地址,所以很多人把它當做指標。

5樓:匿名使用者

地位等同的……但是不完全相同

6樓:匿名使用者

你發重了

c語言中一個二維陣列 它的陣列名是a 那a和*a有什麼區別?

7樓:匿名使用者

對於二維陣列名a和*a,二者的區別在於型別不同。

對於type a[m][n];

當使用a時,可以等同於二級指標type **型。

而使用*a時,等同於type*型。

從概念上說,a表示二維陣列a的首地址,而*a表示二維陣列a第一行a[0]的首地址。這樣在使用的時候就有所區別。比如 對a的操作a[4]表示a的第四行首地址,而對*a的操作(*a)[4]則代表第一行的第4個元素,即a[0][4]。

所以a和*a除了值相同外,其它的各方面都是不同的。

8樓:匿名使用者

資料名可以看作指標常量,分配陣列空間時指標值就確定下來了,不像宣告的指標變數那樣,值是不能改變的。*a=a[0],對於二維陣列a[0]也是一個指標,他們都指向陣列的首地址,值都相等,但是,a和a[0]雖然值相等,但對他們進行指標運算時,地址偏移的基礎不同。

9樓:匿名使用者

其實不大 *a就是a[0]都是第一行的地址

10樓:匿名使用者

有無指標指向的區別。

11樓:匿名使用者

a是這個二維資料首地址,*a是第一個元素值。

c語言中二維陣列的指標如何表示

12樓:夜禮服假面

二維陣列和指標

⑴ 用指標表示二維陣列元素。

要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。

一個二維陣列在計算機中儲存時,是按行儲存的,即先儲存第一行的元素,再儲存第二行的元素。

當把每一行看作一個整體,即作為一個大的陣列元素時,原來的二維陣列也就變成一個一維陣列了。而每個大陣列元素對應原來二維陣列中的一行,稱為行陣列元素,顯然每個行陣列元素都是一個一維陣列。

下面討論二維陣列元素和指標之間的對應關係,清楚了二者之間的關係,就能用指標處理二維陣列了。

設p是指向二維陣列a[m][n]的指標變數,若有:p=a[0]; 則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:p+i*n+j用"*"運算子表示為:*( p+i*n+j)同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如,有如下定義:

int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是一個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

特別說明:

對上述二維陣列a,雖然a[0]、a都是陣列首地址,但二者指向的物件不同。

a[0]是一維陣列的名字,它指向的是一維陣列a[0]的首元素a[0][0],對其進行「*」運算,得到的是一維陣列元素a[0][0]的值,即*a[0]與a[0][0]是同一個值。

而a是一個二維陣列的名字,它指向的是二維陣列a的首元素a[0],對a進行「*」運算,得到的是一維陣列a[0]的首地址,即*a與a[0]是同一個值。它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。

當用int *p;定義指標p時,p的指向是一個int型資料,而不是一個地址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請務必注意。

示例:#include

int main()

,,};

int *p=a[0],max,i,j,row,col;

max=a[0][0];

row=col=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(*(p+i*4+j)>max)

printf("address of a is:%x\n", (unsigned int)a);

printf("address of a[0] is:%x\n", (unsigned int)a[0]);

printf("address of (a+1) is:%x\n", (unsigned int)(a+1));

printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1));

return 0;

}執行結果:

a[2][1]=88

address of a is:bfdc0368

address of a[0] is:bfdc0368

address of a[0][0] is:bfdc0368

address of (a+1) is:bfdc0378

address of (a[0]+1) is:bfdc036c

address of (a[0][0]+1) is:bfdc036c

從結果看出,a,a[0],a[0][0]是同一個地址,

⑵ 用二維陣列名作地址表示陣列元素。

另外,由上述說明,還可以得到二維陣列元素的一種表示方法:

對於二維陣列a,其a[0]陣列由a指向,a[1]陣列則由a+1指向,a[2]陣列由a+2指向,以此類推。因此,*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價,┅,即對於a[i]陣列,由*(a+i)指向。由此,對於陣列元素a[i][j],用陣列名a的表示形式為:

*(*(a+i)+j)指向該元素的指標為:*(a+i)+j陣列名雖然是陣列的地址,但它和指向陣列的指標變數不完全相同。指標變數的值可以改變,即它可以隨時指向不同的陣列或同型別變數,而陣列名自它定義時起就確定下來,不能通過賦值的方式使該陣列名指向另外一個陣列。

示例:求二維陣列元素的最大值。

該問題只需對陣列元素遍歷,即可求解。因此,可以通過順序移動陣列指標的方法實現。

main()

,,};

int *p,max;

for(p=a[0],max=*p;pmax)

max=*p;

printf("max=%d/n",max);

}執行結果:

max=88

這個程式的主要演算法都是在for語句中實現的:p是一個int型指標變數;p=a[0]是置陣列的首元素地址為指標初值;max=*p將陣列的首元素值a[0][0]作為最大值初值;pmax)

}程式執行結果:

a[2][1]=88

⑶ 行陣列指標

對於指標,不管有多複雜,按照以下原則進行分析:

從變數名處起,根據運算子優先順序結合,一步一步分析。

在上面的說明中已經知道,二維陣列名是指向行的,它不能對如下說明的指標變數p直接賦值:

int a[3][4]=,,},*p;其原因就是p與a的物件性質不同,或者說二者不是同一級指標。c語言可以通過定義行陣列指標的方法,使得一個指標變數與二維陣列名具有相同的性質。

行陣列指標的定義方法如下:

資料型別 (*指標變數名)[二維陣列列數];

例如,對上述a陣列,行陣列指標定義如下:

int (*p)[4];它表示,陣列*p有4個int型元素,分別為(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,亦即p指向的是有4個int型元素的一維陣列,即p為行指標。

(按照指標的分析原則進行分析:p先與*結合,說明p是一個指標,然後與結合,說明指標指向的內容是含4個元素的陣列,然後與int結合,說明陣列中的元素為int型別。所以p是一個指向含4個int型別元素的陣列的指標。

)此時,可用如下方式對指標p賦值:p=a;為做對比,比較一下如下指標:int *p[4];

(按照指標的分析原則進行分析:p先與結合,說明p是一個陣列,然後與*結合,說明陣列的元素為指標,然後與int結合,說明指標指向的是int型別的變數。所以p是一個含4個元素的指向int型別變數的指標組成的陣列。

)此外二維陣列不可以用int**型別直接賦值訪問

關於二維陣列指標的問題

其實這是c在實現多維陣列時的魔術而已,實際上a就是一個12個int的資料區。你在寫a 1 2 時編譯器實際上知道這個陣列一行是4個元素,所以計算它的地址為a 1 4 2,即a 1 2 就是 a 1 4 2 另一方面,編譯器允許使用形如a 1 這樣的表述,由於它知道a是一個定義為a 3 4 的陣列,所...

c語言二維陣列

因為你的s是一個二維陣列。如果你的s是一維陣列,像s 20 這樣,那麼在gets時不需要加 0 你定義的s是個二維陣列,並且是char型別,所以每一行存放一個字串。s n 代表第n 1行,而gets時的引數需要是一個字串指標,或者字串陣列名,所以這裡必須要寫作gets s n 其中0 n 20 我明...

怎麼理解指向二維陣列的陣列指標是二級指標

一維陣列的名其實就是指標,如int a 4 a就相當於一個指標 int p a 沒錯 但是二維陣列 int aa 2 3 這個時候是不能用int pp aa 是錯誤的。實際上二維陣列的第一維是int ab 3 是個指標陣列,不是陣列指標。這個時候int ab 3 是與 int 不同的。所以接受二維陣...