C/C++位元組詳解
下面介紹幾個例子,讓大家對位元組有一個相對深刻的認識
sizeof和strlen
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)。
未完待續
相關文章
- 【C++】C++的位元組對齊C++
- c/c++ 位元組對齊C++
- C++ 位元組對齊C++
- 【C/C++】5.位元組對齊和位元組填充C++
- 位元組碼詳解
- NOIP 2017初賽普及組C/C++答案詳解C++
- C++與Qt的位元組序探究:C++QT
- 詳解C++引用C++
- C++ stl容器詳解C++
- c++ vector用法詳解C++
- 詳解Android Gradle生成位元組碼流程AndroidGradle
- 位元組碼檔案結構詳解
- C/C++的轉義字元詳解C++字元
- C/C++語言精髓 *和&詳解C++
- C++引用型別詳解C++型別
- 詳解C++完美轉發C++
- 2013藍橋杯題解c組C++C++
- C/C++記憶體對齊詳解C++記憶體
- C++運算子過載詳解C++
- c++ 智慧指標用法詳解C++指標
- C++之string型別詳解C++型別
- C++ typeid關鍵字詳解C++
- 匿名函式(lambda)詳解 C++函式C++
- C++中指標與引用詳解C++指標
- C++移動語義 詳細講解【Cherno C++教程】C++
- c#組合模式詳解C#模式
- C++類和物件是什麼?C++類和物件詳解C++物件
- 什麼是位元組碼?python位元組碼詳細介紹!Python
- 關於C++中物件與類的詳解及其作用詳解C++物件
- C++拷貝建構函式詳解C++函式
- C++中map的使用詳解說明C++
- C++六種記憶體序詳解C++記憶體
- C++ Break、Continue 和 陣列操作詳解C++陣列
- C++ 單例類别範本(詳解)C++單例
- C/C++ 判斷計算機儲存器位元組序(端序)的幾種方式C++計算機
- NDT演算法詳解與C++實現演算法C++
- 詳解C++中繼承的基本內容C++中繼繼承
- C++指標的概念解讀 超詳細C++指標
- C++案例-員工分組C++