簡體   English   中英

多維數組:指針不指向自己的地址嗎?

[英]Multidimensional arrays: don't the pointers point to their own addresses?

我是一名學習C的學生,試着把頭腦包裹起來。

假設你有一些多維數組int multi[2][2] multi的值將是指向multi[0]地址的指針。 為簡單起見,假設地址為1000.解除引用multi[0]提取另一個地址,這解決了multi[0][0]的地址。 取消引用,反過來,獲取值(或者如果在左側則返回分配地址。)

現在, multi + 1返回第二個指針的地址。 假設我們有4個字節的整數(其中每個嵌套數組有兩個),因此multi + 1返回的地址將為1008.該地址將包含multi[1][0]的地址,該地址為1008 。

所以在這里我看到一個模式:這是不是意味着multi[0]multi[1]等中的地址包含指向自己地址的指針?

數組和指針是不同的。 這個主題在書中經常表現不佳。

int multi[2][2]的情況下,這是一個包含4個連續整數的塊。 沒有涉及指針。 C的類型系統將該塊分成兩個子陣列,每個子陣列包含2整數。

這些表達式: multimulti[0]表示數組。 當您使用表示數組的表達式時,在sizeof&之外的上下文中,將執行轉換,並且該轉換的結果是指向數組的第一個元素的指針。

這個指針是一個右值 ,即它與x + y具有相同的狀態:它是你可以使用的值,但它不消耗任何存儲空間(至少,它不存儲為數組的一部分); 而你不能使用&運算符。

multi的值將是指向multi [0]地址的指針

如果在表達式中使用multi (數組),則將其轉換為指向multi[0]的指針,其值為multi[0]的地址。 在表達式中使用時,數組總是轉換為指向其第一個元素的指針...因此,C中的數組不是第一類對象,不能傳遞給函數(只有它們的地址可以)或賦值(使用memcpy )復制數組)。

解除引用multi [0]提取另一個地址,這解決了multi [0] [0]的地址

沒有“提取”。 取消引用multi[0]產生一個數組,該數組將轉換為指向其第一個元素的指針。 該指針的值是multi[0][0]的地址。 所有這些地址都具有相同的值,因為它們指向內存中完全相同的位置...四個int第一個。

現在,multi + 1返回第二個指針的地址。

同樣, 內存中沒有指針 multi + 1指的是一個數組...兩個int的兩個數組中的第二個。 在表達式中使用該數組轉換為指向其第一個元素multi[1][0]的指針。

假設我們有4個字節的整數(每個嵌套數組有3個),因此multi + 1返回的地址為1012。

呃,你聲明了int multi[2][2] ,這是兩個數組,每個數組包含兩個數組。 所以multi + 1是1008。

該地址將包含multi [1] [0]的地址,該地址為1012。

談論包含地址的地址是沒有意義的。 指針包含地址,但我們在內存中沒有指針,我們只有int multi[1][0]是一個int ,它的地址是1008. multi[1]是一個int數組,它的地址也是1008 ...當然,因為它的地址與它的第一個地址相同元件。

所以在這里我看到一個模式:這是不是意味着multi [0],multi [1]等中的地址包含指向自己地址的指針?

multi[0]multi[1]中沒有地址,有數組int s)。 數組地址,但在這種情況下,它們不包含地址。 “看模式”的方法是根據記憶中的內容來思考。 在這里,你只需要一個4個int的塊 - 兩個兩個int的數組; 數組在C中沒有開銷或其他無關內容,它們只有數據......你聲明的是你得到的。 數組是一個抽象 ,一個由其類型和大小決定的項目組,只存在於編譯時和程序員的腦海中。 因此, multi[0]在C程序的抽象模型中包含一個數組 ,但是內存中的所有內容都是四個int ,前兩個包含該數組。

情況會有所不同

int* multi[2];

你有一個兩個指向int的數組; 每個指針都指向一個int數組(一旦你將它設置為int數組的地址,通常從malloc獲得)。 一旦為子陣列分配存儲器並分配兩個指針,則可以使用此multi使用多方式multi的上方,但類型,大小和的存儲器布局multi[0]multi[1]是在完全不同的這兩個案子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM