C C 位元組詳解

2021-08-10 07:41:34 字數 1385 閱讀 9423

下面介紹幾個例子,讓大家對位元組有乙個相對深刻的認識

1、sizeof計算資料(包括陣列、變數、型別、結構體等)所佔記憶體空間,用位元組數表示。 2

、strlen()計算字元陣列的字元數,以"\0"為結束判斷,不計算為'\0'的陣列元素。

例子

int *p; sizeof(p)=4;

sizeof(*p)

相當於sizeof(int);

對於靜態陣列,sizeof可直接計算陣列大小;

int a[10];char b="hello";

sizeof(a)

等於4*10=40;

sizeof(b)

等於6;

陣列做型參時,陣列名稱當作指標使用

void  fun(char p)

double* (*a)[3][6]; 

cout<

cout<

cout<

cout<

cout<

a是乙個很奇怪的定義,他表示乙個指向double*[3][6]型別陣列的指標。既然是指標,所以sizeof(a)就是4。

既然a是執行double*[3][6]型別的指標,*a就表示乙個double*[3][6]的多維陣列型別,因此sizeof(*a)=3*6*sizeof(double*)=72。

同樣的,**a表示乙個double*[6]型別的陣列,所以sizeof(**a)=6*sizeof  (double*)=24。***a就表示其中的乙個元素,也就是double*了,所以sizeof(***a)=4。至於****a,就是乙個double了,所以sizeof(****a)=sizeof(double)=8。

#include

size_t

offsetof(structname, membername );

求某個結構體的特定成員在結構體裡面的偏移量

理解方式: 1

、(s *)0是騙編譯器說有乙個指向類(或結構)s的指標,其值為0&((s*)0)->m是要取得類s中成員變數m的位址由於這個類(或結構)的基址為0,這時m的位址當然就是m在s中的偏移

2、(s *)0是把0位址轉換為s指標型別,然後從這個指標上「取」m成員再取址,而m成員的位址轉換後結果就是m成員相對於整個物件的偏移量(我們既然是從0位址開始算的,就不用再減去起始位址0)。

未完待續

C C 位元組對齊詳解

一.什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

C C 位元組對齊詳解

一.什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

C C 記憶體位元組對齊詳解

from 例1 include stdafx.h include using namespace std struct a struct b 換乙個順序 int main 其輸出結果為 24 換行 16 不同樣結構體包含相同的元素型別,為什麼得到的長度不相同呢?這就 牽扯到 資料對齊 1.什麼是資料...