二維陣列名和指標的關係,C語言中陣列名和指標的區別

2021-09-11 00:03:00 字數 5421 閱讀 6067

1樓:匿名使用者

二維陣列名即陣列地址,指向首行地址,表面上看,行地址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。

如果a[10][10],假設int **p=a; 那麼要對行遞增執行p++時,編譯器如何知道列寬?因為int **是指指向一個 int *型別的指標,32位系統中int *的寬度為4位元組,即地址寬度是4位元組,因此p將指向下一個元素(整數指標),也就是p遞增了4位元組,而不是10個int型資料的寬度,這就錯位了。

所以a[10][10]的地址型別不是簡單的指標的指標,而是行指標的指標,而行寬是由你定義的陣列列數和元素型別所決定,int型別就是4*10=40個位元組。這叫資料對齊。因此編譯器在轉換陣列名時,會根據對齊要求而確定相應的指標型別,所以a的地址型別應該是int (*)[10],而不是int **。

所以應該這樣:int (*p)[10]=a;

其含義為,p是一個指向(含10個int型別元素的一維陣列或行的)指標,其實本質上任何指標都是4位元組(32位系統),你完全可以將一種指標型別強制轉為任何其他型別,那為什麼還要區分指標型別,就是為了指標運算時實現資料對齊,準確定位。

2樓:匿名使用者

應該這樣寫

int a[10][10];

int (*p)[10]=a;

p是行指標,一行有10個元素

3樓:水晶果凍

int a[10]; int *p=a代表將a陣列的地址傳給指標p,而a[10][10]的a既不代表一行的地址也不能代表整個二維陣列的地址,所以無法傳給**p啊

4樓:匿名使用者

c語言中陣列名和指標的區別

5樓:匿名使用者

陣列在當作引數傳遞時,可以當作指標;當然,引數傳遞相當於賦值操作,所以用指標來接受陣列的值也是可以的。

除此之外,指標就是指標,陣列就是陣列,一點也不一樣,例如1,陣列名不能作為左值,即不能被賦值,也不能進行++ --操作2,sizeof 陣列名 和 sizeof 指標 不同

6樓:

陣列名本質上就是個指標,也就是地址,但是它是一個常指標,是個固定值,而指標是是指標變數的簡稱,是個變數,這個變數存放的是地址值,它的值是可以改變的。例如:

int *p;

int a,b;

p=&a;  //把變數a的地址賦值給指標p,那麼指標p就指向了變數a的記憶體單元

p=&b;  //把變數b的地址賦值給指標p,那麼指標p就指向了變數b的記憶體單元

int a[10];  //整型陣列,陣列名a本質上是一個地址,是首元素地址,它是一個固定值,不能對它進行賦值操作。

c語言中的二維陣列名是一個二重指標嗎?

7樓:

應該不是的,簡單來說,陣列名,不管是多少維度的都是採用名稱**表相應的存放地址。雖然二重指標也是存放資料的地址但是其是間接的存放。就打個比方,二重指標就如一個廠家有好多貨要賣出去。

而自己又沒有銷售渠道,只好通過**商來提貨,通過分銷商來賣給消費者;二維陣列就如廠家有貨而且自己有渠道直接銷往消費者。 不知這樣說是否容易理解。

8樓:瀚漠

不是二級指標p也可以解釋為指標的指標,即p內儲存的值實際上還是一個指標,計算:

*p的值實際上是一個指標值,那麼 *(*p)即二級指標指向的最終值

對於二維陣列a[2][2],a也是一個地址,並且這個值也等於a[0],也等於a[0[0]的地址,即&a[0][0],由此看來對a取地址的值是一個變數值(不是指標),所以a並不是一個二級指標,最多算一個一級指標。

9樓:匿名使用者

1、二維陣列名不是二級指標,它只是一個比較特殊的常量指標。包括三維,四維,乃至n維陣列也是如此。只要是陣列,那麼它就是一個普通的常量指標。

2、二級指標p也可以解釋為指標的指標,即p內儲存的值實際上還是一個指標,計算:

*p的值實際上是一個指標值,那麼 *(*p)即二級指標指向的最終值。

對於二維陣列a[2][2],a也是一個地址,並且這個值也等於a[0],也等於a[0[0]的地址,即&a[0][0],由此看來對a取地址的值是一個變數值(不是指標),所以a並不是一個二級指標,最多算一個一級指標。

陣列名和指標的區別

10樓:匿名使用者

可以!下面是我學習陣列和指標的總結: (1)指向陣列首地址

對於一維陣列a[10]:陣列的首地址為a; 呼叫:p=a; *(a+i)或者*(p+i)

對於二維陣列a[3][4]:整個陣列的首地址為a[0];呼叫:p=a[0]; *(a[0]+i)或者*(p+i)。此時a代表陣列第一行的地址。

(3)指向陣列的每行

形如:int a[3][4];

int (*p)[4]; p=a;

呼叫:*(*(p+i)+j)例:;

int (*p)[4],i,j;

cin>>i>>j;

p=a; //a代表的是陣列第一行的首地址.

cout<<*(*(p+i)+j)<

(4)指標陣列

例如:(字串陣列指標法)

; cout<

處理字串還有以下方法:

(字元陣列法,c-string法)

;cout<

(字串陣列法,string法)

; cout<

三種方法的共同點是name[0]都是代表的"basic"的首地址而非其本身。

(5)指向指標的指標

形如 char **p;例:;

p=name+2;

cout<<*p<

cout<<**p<

分析:*p=name[2]= "c++"的首地址,(通常所說一個字串的“地址”實際上指的是它的“首地址”或者“起始地址”),用cout 輸出的不是字串的首地址而是整個字串(只要把一個字串的起始地址給它,cout就一直往後面輸出,直到遇到結束符'\0'為止),為了證明這一點,請看:string a=“finish”;cout<

故:本例中第一個*p輸出"c++",第二個**p代表"c++"的首地址的內容,即c。

在上一例中,name[0]為"basic"的首地址,輸出"basic",若換成*name[0]則輸出b,若換成name則代表整個陣列的首地址(而不是單個字串"basic"的首地址),所以此時輸出的是整個陣列的首地址。若用*name則輸出整個陣列的首地址的內容,即"basic"(可見字串的首地址內容為單個字元,一維陣列首地址的內容為它的第一個元素,對於二維陣列,比如int a[3][4],a代表的是第一行的地址,所以cout<

11樓:匿名使用者

可以。a是陣列名,相當於陣列的首地址,b是一個指標,int *b = a; 然後b就指向a這個地址,呼叫b[4]就是b+4的地方,也就是a+4這個地方,然後就是同一個地方,所以b[4]等價於a[4]

二維陣列名是不是一個“指標”?

12樓:匿名使用者

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

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

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

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

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

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

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

13樓:匿名使用者

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

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

對於你的提問中:

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

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

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

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

#include

void main()

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

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

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

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

但是兩個值是一樣的。

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

14樓:匿名使用者

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

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

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

15樓:小飛花兒的憂傷

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

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

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

c語言中二維陣列名是不是可以看作指標陣列名

不可以,二維陣列要看做 陣列的陣列 以如下定義為例 int a 4 int p 給你個對於指標和陣列的正確理解吧 定義的不同 c 裡,指標和陣列是不同的型別,不要把陣列名看做 常指標 所以 sizeof a 和 sizeof p 值是不同的。操作 除宣告外,中括號操作符僅用於指標,如 p 0 p 5...

為什麼C語言中二維陣列的陣列名a和a表示的是同值

當定義二維陣列a m n 時,陣列名可以認為是二維指標,其指向二維陣列的首位址。於是a的值就是首位址的值。而 a,就是a 0 a 0 是第一行的標記,代表第一行的首位址。在二維陣列中,所有元素都是緊密排列的,這樣整個陣列的首位址,第一行的首位址,和第乙個元素的首位址,即a,a 0 a 0 0 都是相...

C語言指標與二維陣列求解,c語言中二維陣列的指標如何表示

假設a是乙個二維陣列,則一 a是第乙個一維陣列名,陣列名 就是該陣列的 首位址!二 a 0 和 a都表示這個一維陣列第乙個元素的內容 這句話有問題,應該是 都表示這個 二維陣列 第乙個元素的內容!三 a和a好像不等價啊?關於陣列名和 陣列名書上有明確的介紹與說明 a a a 0 a 0 這是規定!細...