轉乙個比較牛的sizeof分析

2021-09-06 02:39:42 字數 1553 閱讀 4258

那是很給力啊:

關於sizeof ,今天出來討論下,希望感興趣的童鞋都來一起討論。

ps: 由於某些編譯器的差異,這裡只討論vc++的情況

sizeof是c/c++下的運算子,可用於任何變數名、型別名或常量值。

sizeof有三種語法形式,如下:

1) sizeof( object ); // sizeof( 物件 );

2) sizeof( type_name ); // sizeof( 型別 );

3) sizeof object; // sizeof 物件;

今天主要討論指標和陣列的使用 具體其他的 可以自己查閱msdn

指標變數的sizeof

指標記錄了另乙個物件的位址。既然是來存放位址的,等於計算機內部位址匯流排的寬度。

所以在32位 計算機中,乙個指標變數的返回值必定是4(注意結果是以位元組為單位),可以預計,在將來的64位系統中指標變數的sizeof結果為8。

陣列的sizeof

陣列的sizeof值等於陣列所占用的記憶體位元組數,也就是陣列的長度

現在看段**就清楚了

char str = 「xxoo」;

char *p = str ;

int l = sizeof (str );

l = sizeof ( p );

可以分析

int l = sizeof (str );// sizeof 陣列名時是計算陣列的長度

l = sizeof ( p );     // p是個指標,指標在32位機子上長度是4位元組的

在這裡就可以發現,其實求得是陣列長度 不是陣列元素個數

但是如果我們需要求陣列的個數如何求?其實還是蠻簡單 msdn有模型:

int xx = sizeof( oo ) / sizeof( char ); // 總長度/單個元素的長度

sizeof()是c++語言自已的運運算元。一般而言,關於運運算元的行為屬於語言本身自已的規定,不存在為什麼的問題。也就說c++為sizeof運運算元規定的行為就是要對陣列名返回其陣列所佔記憶體的byte計數,而對其它變數返回應有的型別byte長度,

比如:把」char str;」改為」long str[4];」則」sizeof(str);」將返回值為16(16個byte)。而對其指向陣列str[4]指標,在32位平台上記憶體位址的byte長度4。

下面引用乙個經典例題:

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

cout

既然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。

乙個有關sizeof的bug

sizeof常常用來計算位元組大小,但是對於sizeof你了解多少呢?下面我就遇到的乙個需要注意的地方做乙個記錄。首先,sizeof作用是計算變數的大小,但它不是函式,是關鍵字,這個容易出錯。然後,看下面 include int array define array num sizeof array...

轉乙個linux apache 日誌分析與狀態

ps.轉的一篇文章 假設apache日誌格式為 問題1 在apachelog中找出訪問次數最多的10個ip。awk apache log sort uniq c sort nr head n 10 awk 首先將每條日誌中的ip抓出來,如日誌格式被自定義過,可以 f 定義分隔符和 print指定列 ...

對乙個類求sizeof

include using namespace std class base int main int main int main private int a 佔4位元組 char p 4位元組指標 class derive public base derive private static int...