C 語言指標的指標和二維陣列的區別

時間 2021-05-11 18:55:56

1樓:「已登出」

C系的二維陣列是按行儲存的普通陣列,而不是在託管&指令碼語言中更普遍的引用陣列,二維陣列是乙個「以行為單元的陣列」,而不是「以對陣列的引用為單元的陣列」。

也就是說,T[x][y]是「Array」(當然C系不會這麼寫),而不是Array。

所以typeof &T[x][y](也就是說typeof a),是T(*)[y]。

這種指標通常被叫做「行指標」。

2樓:John Kkk

我想大家說得話只對理解了這個問題的人有用,但是對於不理解這個問題的人來說,大家的答案只會讓人越看越暈,我想題主應該是初學者(雖然我也差不多),下面說下我認為比較容易理解的:

1.首先:

int **p;

int *a;

int c = 3;

a = &c;

然後:p = &a;

這很自然;注意:我們使用識別符號p來接收&a;而不是*p = &a;所以:

p = &a;

就是給p層賦值,也就是說*p就是a(注意不是&a);

一定要弄清楚:使用識別符號p時,是給p層賦值的;

就想:int *t;

int k = 2;

t = &k;

使用t = &k;就是給*t層賦值(*t就是k);

然後我們來分析p;

p有兩層:

p層和*p層;

對p層解除後可得到*p層;

對*p層解除後可得到**p層;

但是p指標總共只有p層和*p層,而不是*p層和**p層;

所以*p就是a;而**p就是*a;

雖然我們只給p層賦值,對p層解除後得到*p層,而*p是a;而a又是乙個指標,所以我們可以對*p層再進一次解除,也就是對

a進行解除;

這也很自然能理解;

下面是重點:

int t[2][3] = ,};

p = (int**)t;

這裡,同上,我們直接這麼做,即使用名稱p,來接受乙個(int**)值;

所以只是給p層賦值了;

然後我們解除第一層引用:*p,這也沒問題,因為剛剛賦值了乙個(int**)值給p層;

然後我們再解除第二層引用:**p,肯定報錯,因為我們沒有給*p層賦值;所以肯定不能夠進行解除引用,

這個..就想下面這個例子一樣的報錯:

int *p = nullptr;//或者賦值NULL

printf("%d", *p);

肯定報錯啊,編譯器想,你丫的你都沒給p層賦值,你就想解除引用*p?你要我去哪定址?

到這裡,我要說乙個問題就是,我們在給乙個指標變數賦值時,一定要注意乙個問題,

那就是,賦值時,一定要明白是給哪個層賦值的,然後解除引用後取得值是哪個,還有可以解除多少次引用等等,

int**p;說明p可以解除兩次引用,第一次解除p層;第二次解除*p層;

3樓:Cyandev

課上用手機答的,簡單說一下吧。

首先題主要知道多維陣列實際上在記憶體中的結構與一位陣列是一樣的,也就是說,它們都是連續的,不管是幾維。

舉個例子:

int arr[2][2][3] = , }, , }};

其實就等價於一位陣列把它們按順序寫。

OK,明白這個了咱們再繼續看。

題主認為多維陣列可以這麼表示:

int **p = (int **) arr;

咱們不妨先對這個指標取一層位址的值:

int *x = p[0];

這裡 x 肯定是 p 所表示的位址的值,p 的值又與 arr 相等,那麼 x 肯定是 1。對於乙個位址為 0x1 的指標,你直接取陣列下標允許的值,最後指向的都是乙個非法位址,當然會出現段錯誤。

應該的表示方法是 int (*p),這個讀作指向陣列的指標,這時 p 指向的是乙個二維陣列。

然後你寫 p[0], p[1] 它們的結果都是位址,根據你型別中陣列的大小計算的,也就是說你不光要這麼寫,還要吧大小寫上,不然編譯器不知道位址的增量是多少。

這時你可能說了,main 函式的 argv 不是 char ** 麼,為啥它行?

注意,雖然 string 可以簡單表示成 char *,但是 argv 的另乙個寫法是 char *argv,它讀作指標的陣列,也就是說這個陣列本身裡面的值就都是一些 char 指標,你寫 argv[0],它的結果還是個指標,所以你可以再進一步取裡面的元素,或直接拿這個字串指標該幹啥幹啥。

所以如果題主想寫成 int **,那方法就是先構造幾個 int 陣列,然後分別拿到它們的位址,再放入乙個新的陣列中,然後你可以寫成 int **。

4樓:歐文韜

因為int [2][3]的長度是24,offset是乙個int的長度是4。而int**是的offset是乙個指標的長度,在64位系統下是8。解引用以後取指標長度,也是8位元組。

那麼這個結果不是對的嘛。

所以你應該用int*而不是int**

回覆裡有人說offset是sizeof(int)*3。從語法層面來說的話確實是這樣。所以我上面提到的offset是int的長度是指這個資料塊裡連續放著了2*3=6個int

5樓:唐偉男

採用int(*p)[3] = a;即可,因為2維陣列返回的型別是int(*)[3].並且這貨是隱式轉換的。。2樓說的很好。。

6樓:

幾維陣列都是int*,而不是int**之類的。就這麼簡單。

二維陣列和一維陣列的區別,是語法上的,本質根本沒有二維陣列這種東西。

1000個士兵,排成一排,方陣(33X33+X),或者立體(10X10X10),指定第乙個士兵的位置為整個兵團的位置。所以兵團位置就是士兵位置,不是位置的位置。

其實 a = a[0] = &a[0][0],另外陣列就是指標的另乙個名稱,當然C語言有些特殊處理,但是實質上一樣的。

7樓:黃哥

c語言,指標陣列:首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是「儲存指標的陣列」的簡稱。

陣列指標:首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是「指向陣列的指標」的簡稱。

8樓:harold.cai

當p=a時,二維陣列名a作為右值是乙個指向陣列的指標,p是乙個指向指標(指向int)的指標,當p=a時,由於型別不同會警告,解引時會出現錯誤,二級指標和二維陣列名有本質區別,應定義為int(*p)[3],指標和陣列這裡建議樓主多看點書,自己領悟最重要。

請問這個二維陣列指標怎麼理解?

barenice 二維陣列a 5 5 可以這樣理解 a陣列包含5個陣列a 0 a 1 a 2 a 3 a 4 a i 又包含5個陣列 a i 0 a i 1 a i 2 a i 3 a i 4 i 1,2,3,4 以矩陣的形式列出如下 a 0 a 1 a 2 a 3 a 4 然後,讓我們重溫一下這個...

C語言二維陣列的名稱的困惑?

暮無井見鈴 講無型別的位址本身儲存什麼值沒有意義。位址是什麼型別指標的值 要求合法且非 NULL 該位址 就儲存這個型別的物件。注意具體程式中能合法讀取某個位址的指標型別是較為有限的。arr 是 int 10 10 型別陣列物件,可以隱式轉換成 int 10 型別指標值。該指標值指向陣列首元素。取 ...

c語言函式是如何獲取傳入的陣列(指標)的指標所指向內容的長度的,有辦法嗎?

陳昱 如果是new出來的話,有可能找到,想想delete array時,系統是如何知道需要delete的長度的呢?一種說法是array指標的位址前面的位址,有儲存該陣列大小的資訊,於是可以獲取到了,具體不確定 c語言的情況下,老老實實的把長度帶上。就好比你給搬家公司的人說我要搬家,然後人家說我派一輛...