C/C++位元組詳解

啊浪的部落格發表於2017-11-04

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


sizeofstrlen

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[])

{sizeof(p)等於4}

 

 

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

cout<<sizeof(a)<<endl; // 4 a為指標

cout<<sizeof(*a)<<endl; // 72 *a為一個有3*6個指標元素的陣列

cout<<sizeof(**a)<<endl; // 24 **a為陣列一維的6個指標

cout<<sizeof(***a)<<endl; // 4 ***a為一維的第一個指標

cout<<sizeof(****a)<<endl; // 8 ****a為一個double變數

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。




offsetof

#include <stddef.h>

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)。

 

 未完待續



 

 

 

 

 

相關文章