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


2011年4月9日17:42:57

C中的字符串數組與字符串指針的區別

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

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

2011年4月10日11:24:40

c中多維數組的內存分配過程

第一種方法:

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

*arr值為0x003C4F78, 這是指向的rows個int*所在的內存位置

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

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

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

具體分配的內存為:

  1. 在內存1中查看

  2. 在內存2中查看

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

    具體的內存分配為:

    1. 在內存1中查看

    2. 在內存2中查看

       

      二維指針(int**) 占4個字節, 3個一維指針(int*)各占4個字節

      每個一維數組占16個字節, 相當於rows*cols+rows+1個整型(4個字節)

第2中方法:

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

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

現在還沒有執行對*brr分配內存,所以brr處的內存是隨機的,

(2)第一個if執行完畢, 分配了3個(int*)大小的空間, 所在的內存位置為0x00244fc0

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

還沒有執行第二個if 之前,沒有對(*brr)[0]進行空間的分配, 內存中的數都是隨機數

第二個if執行之后, 為(*brr)[0]完成了空間分配, (*brr)[0]的分配所得到的內存在0x00241380處, 此時共有rows*cols*4=48個字節數

我們到0x00241380處查看, 可以發現, 所分配的48個int型內存進行了初始化

到此為止, 其實內存都已經分配完畢, 現在所要做的就是為(*brr)[1]和(*brr)[2]進行賦值.

for循環執行一次之后, 我們得到(*brr)[1]的地址, 即0x00241390, 相當於在這個內存處開始是8個int整型數(第2個一維數組)

for循環執行兩次后, 我們得到(*brr)[2]的地址, 即0x002413a0, 相當於在這個內存處開始是8個int整型數(第3個一維數組)

可以發現這些地址之間是相差16個字節的,他們的內存是連續的.

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

 

2011年4月10日20:24:58

C語言中多維數組int*******的解析

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

可以這樣看, 這是一個4維的數組, 具體分配空間的時候, 是利用malloc或calloc分配N個int***空間, 然后arr就是一個int****型的指針, 指向分配的int***所在的內存位置. 同樣, 對於N個int***中每一個, 也是利用malloc分配N2個int**空間, 接下來的都類似


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM