下面介紹幾個例子,讓大家對位元組有乙個相對深刻的認識
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.什麼是資料...