[英]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
整數。
這些表達式: multi
, multi[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.