關於陣列在記憶體中的存放形式

2021-07-03 03:47:19 字數 1517 閱讀 7580

char a[3][3];

sizeof(a); //結果是9

9這個結果一直認為是「理所當然」,但是當自己實現乙個二維陣列時,最簡單的方式就是:

char **test = (char**)malloc(sizeof(char*)*row_size);

int i=0;

for(;ichar*)malloc(sizeof(char)*col_size);

其實這樣獲得陣列大小是row_size*col_size+row_size*4位元組沒錯吧。

上述記憶體並非連續,那連續的

可是還是得有前面的幾個一維指標指向後面的一位陣列,所以大小還是上面那個……

所以我的就有些驚奇,寫了測試,結果列印出來的內容更加讓我驚奇……char a[3][3]得到的&a==&a[0]==&a[0][0]。但是細細想來,這與sizeof(a)==9沒有一點矛盾衝突。可是問題又來了,c語言在沒有過載的情況下是如何實現的(**中我是用c++寫的)?是編譯器的功勞麼?

#include 

using

namespace

std;

int main()

其實這個問題就是陣列在記憶體中的存放形式以及編譯器是如何處理陣列的初始化的。於是,我就取巧地在csdn發了貼詢問,原帖內容。我決定在這裡記一筆,整理一下比較好。

對於一維陣列:

int a[3];

&a[i]=(int*)a+i;

對於二維陣列:

int a[3][3];

&a[i]=(int(*)[5])a+i

歸納總結一下:

template 設有定義

t a[n];

那麼對於任意int i有

a[i] == *((t*)a + i)

這是陣列的定址方式

這裡要特別強調一下,一直以來都把指標變數和陣列名等價,但從&a==a這一點可以看出,陣列名並不是指標變數,它不存在自己的記憶體空間,只是乙個符號而已。見下:

從上面的**中可以看出來,引用的作用和陣列名的作用是相同的,然而指標則是不一樣的!!!!所以說當a[i][j]進行定址時,編譯器在編譯時直接就將其轉化為上述形式,無需其他額外位址進行輔助。然而人為地創造乙個陣列,並且對這一塊連續區域進行操作,就必須自己設定一種方法——額外新增頭指標用來定址。

關於String在記憶體中的存放

string s1 abc 這個字串s1被賦予了值 abc 首先,查詢stringpool中有沒有 abc 這個值,如果不存在,那麼就將其存進去,如果已經存在,那麼就會被s1所呼叫。string s1 abc string s2 abc s1和s2所指向的物件是同乙個,以下 能夠看出來 system...

c語言 結構體在記憶體中的存放形式

第一篇部落格,請大家多多包涵!使用sizeof 運算子計算結構體在記憶體中所占用的位元組數很明顯可以看到與實際宣告型別的位元組數不同。sizeof 是用來計算型別在記憶體中所佔位元組數的大小 對於剛入門的同學肯定會很疑惑,結構體在記憶體中到底是怎樣存放的呢?struct nameattribute ...

bmp在記憶體中的存放

bmp 儲存影象 每張圖按大小來儲存,即影象的長寬畫素大小。如果一張的畫素是 240x320,則此影象在記憶體的存放是乙個 240x320的陣列,每個陣列的元素是int整形 整數占用4個byte 數位相機中所謂的支援500w畫素就是這個意思,代表它能處理多大的圖形色彩資訊的能力,畫素越高,需要處理時...