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++ 位元組對齊C++
- 【C/C++】5.位元組對齊和位元組填充C++
- C++ 位元組對齊C++
- 位元組碼詳解
- C++與Qt的位元組序探究:C++QT
- C語言:記憶體位元組對齊詳解C語言記憶體
- C/C++—— 記憶體位元組對齊規則C++記憶體
- NOIP 2017初賽普及組C/C++答案詳解C++
- c/c++使用位元組時,易出錯點梳理總結C++
- 位元組碼檔案結構詳解
- 詳解C++引用C++
- C++ Virtual詳解C++
- JVMClass詳解之二Method位元組碼指令JVM
- C++ stl容器詳解C++
- c++ vector用法詳解C++
- C++堆疊詳解C++
- C++ 字串使用詳解C++字串
- C++物件模型詳解C++物件模型
- 詳解Android Gradle生成位元組碼流程AndroidGradle
- Java Class 位元組碼檔案結構詳解Java
- C/C++—— C++中一個空物件為什麼還要佔用一個位元組空間C++物件
- C++ 檔案操作詳解C++
- C++ 智慧指標詳解C++指標
- C++引用型別詳解C++型別
- c++ 虛繼承詳解C++繼承
- 詳解C++完美轉發C++
- C/C++的轉義字元詳解C++字元
- C/C++語言精髓 *和&詳解C++
- C/C++常見錯誤詳解C++
- C/C++編譯過程詳解C++編譯
- c#組合模式詳解C#模式
- Python struct(位元組流,組包拆包實現)模組詳解PythonStruct
- 【C++】C++ 記憶體分配(new,operator new)詳解C++記憶體
- 什麼是位元組碼?python位元組碼詳細介紹!Python
- C# 位元組陣列位操作C#陣列