天天看點

C中數組與指針及多元數組

2011年4月9日17:42:57

c中的字元串數組與字元串指針的差別

C中數組與指針及多元數組
C中數組與指針及多元數組
C中數組與指針及多元數組

從上面的截圖,我們可以看到字元數組和字元串的差别。他們的類型是不同的,比如上面的代碼中,filename的類型是char[12],而pname的類型是char*,&filename的結果是數組指針,圖中顯示的是char[12]*。還可以發現,對于pname和p雖然是兩個不同的指針,但是他們都指向同一個位址,這也是編譯器投機取巧的地方,因為他們都是指向"fangzhen"這個字元串,是以編譯器就隻存儲一次。

還有&"fangzhen"的用法也是可以的。

2011年4月10日11:24:40

c中多元數組的記憶體配置設定過程

第一種方法:

C中數組與指針及多元數組
C中數組與指針及多元數組

arr值為0x002efaae8, 指向int**所在的位置,即*arr所在的位置

C中數組與指針及多元數組

*arr值為0x003c4f78, 這是指向的rows個int*所在的記憶體位置

C中數組與指針及多元數組

可以看到綠框後面還有8個初始化化為0的位元組, 其實後面是(*arr)[1]和(*arr[2])的位址, 共rows(3)個int*的位址,即共3個int**

第一個int*所在的位置為0x003c1290, 沒有進行初始化

C中數組與指針及多元數組

第二個int*所在位置為0x003c12e0(從下圖我們可以讀出)

C中數組與指針及多元數組

具體配置設定的記憶體為:

在記憶體1中檢視

C中數組與指針及多元數組

在記憶體2中檢視

C中數組與指針及多元數組

第3個int*所在位置為0x003c1580(從下圖的藍色框内可以看出)

C中數組與指針及多元數組

具體的記憶體配置設定為:

C中數組與指針及多元數組
C中數組與指針及多元數組

二維指針(int**) 占4個位元組, 3個一維指針(int*)各占4個位元組

每個一維數組占16個位元組, 相當于rows*cols+rows+1個整型(4個位元組)

第2中方法:

C中數組與指針及多元數組

(1)還沒有執行第一個if

C中數組與指針及多元數組
C中數組與指針及多元數組

brr是*brr的位址, 即這個二維指針int**首位址

現在還沒有執行對*brr配置設定記憶體,是以brr處的記憶體是随機的,

(2)第一個if執行完畢, 配置設定了3個(int*)大小的空間, 所在的記憶體位置為0x00244fc0

C中數組與指針及多元數組

*brr的值為0x00244fc0, 其實這也是第一個int*的位址

C中數組與指針及多元數組

還沒有執行第二個if 之前,沒有對(*brr)[0]進行空間的配置設定, 記憶體中的數都是随機數

C中數組與指針及多元數組

第二個if執行之後, 為(*brr)[0]完成了空間配置設定, (*brr)[0]的配置設定所得到的記憶體在0x00241380處, 此時共有rows*cols*4=48個位元組數

C中數組與指針及多元數組

我們到0x00241380處檢視, 可以發現, 所配置設定的48個int型記憶體進行了初始化

C中數組與指針及多元數組

到此為止, 其實記憶體都已經配置設定完畢, 現在所要做的就是為(*brr)[1]和(*brr)[2]進行指派.

for循環執行一次之後, 我們得到(*brr)[1]的位址, 即0x00241390, 相當于在這個記憶體處開始是8個int整型數(第2個一維數組)

C中數組與指針及多元數組

for循環執行兩次後, 我們得到(*brr)[2]的位址, 即0x002413a0, 相當于在這個記憶體處開始是8個int整型數(第3個一維數組)

C中數組與指針及多元數組

可以發現這些位址之間是相差16個位元組的,他們的記憶體是連續的.

通過比較上面的兩個函數, 我們也可以看到, 其實不同在于, 第一個的空間是分散的, 第二個的空間是連續的.

2011年4月10日20:24:58

c語言中多元數組int*******的解析

C中數組與指針及多元數組

對于一個int****arr;的聲明,

可以這樣看, 這是一個4維的數組, 具體配置設定空間的時候, 是利用malloc或calloc配置設定n個int***空間, 然後arr就是一個int****型的指針, 指向配置設定的int***所在的記憶體位置. 同樣, 對于n個int***中每一個, 也是利用malloc配置設定n2個int**空間, 接下來的都類似