C語言多維陣列,結構體解析

2021-08-20 21:56:31 字數 2964 閱讀 3998

首先講解乙個誤區

我們都知道a代表陣列的首位址,&a也是陣列的位址,所以它們輸出的結果是一樣的,那麼為什麼a+1 和 &a+1的結果不一樣呢?

因為a代表的是陣列的首位址,也就是a[0]的位址,乙個int *型別的指標指向a[0] 

&a代表是陣列的位址,也就是a[5] 這個陣列的位址,所以這個是 int (*)[5] 型別的指標,也就是陣列指標

指標 +1的意思是指移動指向的型別大小的位置,如果是char 指標,每加1就移動了乙個位元組的位置,

int指標每加1就移動了4個位元組的位置,這就解釋了為什麼&a+1 是移動了20個位元組,而a+1移動了4個位元組

可以使用指標來代替陣列

int *a = (int *)malloc(sizeof(int) * 5);

int a[5];

這兩個的效果是一樣的

接下來說一下多維陣列

我們類似於上面同樣輸出了二維陣列的名字,並且加1,結果是差了8個位元組,正好是第二維陣列的大小

那麼我們是不是可以認為,二維陣列其實就是 多個陣列指標的集合呢

這樣我們就可以自己造乙個二維陣列

int main()	}	

for(int i = 0; i < 3; i++) }

free(p);

return 0;

}

現在我們可以下結論了  多維陣列名的本質是乙個陣列指標

首先討論一下結構體的記憶體分配問題,還是乙個例子引出

乙個結構體裡面定義了int 和char  兩個字段,但是輸出的大小確是8

在看乙個例子

還是8, 這個問題就值得**了

我來畫個示意圖

也就是說這個結構體最大的記憶體是int 4個位元組,所以後面分配的記憶體都是按照四個位元組來分配,但是如果前面的記憶體沒有使用完,會優先使用前面的記憶體,也就造成了這個現象,當插入到第五個char的時候第二塊記憶體不夠會繼續分配四個位元組的記憶體

知道了這個特性,就可以討論不規則順序儲存了

struct person

;

當結構體是這種情況的時候,記憶體是這樣分配的

均勻分配,所以並不是放在c後面的兩塊空間,而是最後的兩塊空間

可以從各個資料的位址看出,確實是這樣 a和c 差了四個位元組  c和s差了兩個位元組

所以我們定義結構體的時候,要注意字段定義的順序,順序不同,可能記憶體的大小也會不同

下面討論一下乙個結構體中引用另外乙個結構體

struct person

;

這個結構體的大小是 12個位元組

struct teacher

;

這個結構體的大小是 8個位元組

struct person

;

那這樣如果正常來想,肯定會是兩個結構體的記憶體大小相加 也就是20個位元組

現實總是不如意,我們如果把teacher t 換成 double age;  按照上面的計算方式來算一下,正好是24個位元組

so..如果遇到這種結構體嵌入,可以直接替換成原結構體的字段,不過是順序不能變罷了

我們可以根據型別來調整字段定義的順序,以確保能最大限度是使用記憶體

如果在記憶體非常緊張的地方,想使用那些被「浪費「掉的記憶體也是可以的

struct person

;

這種情況,c後面會有乙個位元組的記憶體沒有用到

int main()

如果上面的**看不懂,推薦看一下我之前的部落格c語言 巧用指標型別不匹配

結構體的位欄位,這個在嵌入式系統用的比較多,將記憶體計算到位的階層,不會浪費一點記憶體,, 真是可怕

當結構體中有指標的時候要注意 深拷貝淺拷貝的問題

這個改天再寫乙個深拷貝淺拷貝的**

結構體指標的高階應用

主要就是利用位址的偏移量加上強轉,來獲取結構體裡面的內容,這個我暫時還沒有使用過,不過可以加深對c語言位址和指標的理解,適當了解一下

C語言 結構體陣列

經常在微控制器上應用的的資料結構 結構特點是 1 編譯的時候就可以知道微控制器資源是否夠用 2 對比鍊錶這種動態申請記憶體的資料結構,不知道什麼時候記憶體就被申請完了,造成無法預知的後果 下面是我在rt threat中的簡單應用 首先定義乙個結構體,然後就可以定義乙個結構體陣列了 typedef s...

C語言新手練習之多維陣列 結構體及函式

題目 有乙個顏色集合,裡面有若干個顏色值 rbg系統表示 現在有若干個顏色值需要對映到集合中的某個值。具體的對映方法是找到集合中和它的顏色距離最小的進行對映。在rgb顏色系統中,顏色用 r,g,b 三元組表示,r,g,b是0到255之間的整數。兩個顏色之間的距離定義如下 假設給定兩個顏色的三元組分別...

簡單解析C語言結構體

1.結構體的定義 結構體是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構。在c語言中,結構體指的是一種資料結構。宣告乙個結構體型別的一般形式如下 struct 結構體名 具體宣告如下所示 struct struct 注意最後乙個有分號 注意 結構體型別的名字是又乙個關鍵字struct和...