欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++ sizeof(上)

 更新時間:2020年08月15日 09:59:47   作者:Dabelv  
這篇文章主要介紹了C++ sizeof的相關資料,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下

sizeof是C/C++中的一個操作符(operator),其作用是返回一個對象或者類型所占的內存字節(jié)數,使用頻繁,有必須對其有個全面的了解。

1.sizeof的基本語法

sizeof有三種語法形式。

(1)sizeof(object); //sizeof(對象);
(2)sizeof(type_name); //sizeof(類型);
(3)sizeof object; //sizeof對象;

第三種語法結構雖然簡約,但并不常見,為簡單統(tǒng)一,建議使用第一和第二種寫法。

int i;
sizeof( i ); // ok
sizeof i; // ok
sizeof( int ); // ok
sizeof int; // error

2.sizeof計算基本類型與表示式

sizeof計算對象的大小實際上是轉換成對象類型進行計算,也就是說,同種類型的不同對象其sizeof值都是一致的。這里,對象可以進一步延伸至表達式,即sizeof可以對一個表達式求值,編譯器根據表達式的最終結果類型來確定大小,sizeof是編譯時進行運算,與運行時無關,不會對表達式進行計算。考察如下代碼:

#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
cout<<"sizeof(char)="<<sizeof(char)<<endl;
cout<<"sizeof(short)="<<sizeof(short int)<<endl;
cout<<"sizeof(int)="<<sizeof(int)<<endl;
cout<<"sizeof(long)="<<sizeof(long int)<<endl;
cout<<"sizeof(long long)="<<sizeof(long int int)<<endl;
cout<<"sizeof(float)="<<sizeof(float)<<endl;
cout<<"sizeof(double)="<<sizeof(double)<<endl;
int i=8;
cout<<"i="<<i<<endl;
cout<<"sizeof(i)="<<sizeof(i)<<endl;
cout<<"sizeof(i)="<<sizeof(i=5)<<endl;
cout<<"i="<<i<<endl;
}

在64bits的Windows下運行結果如下:

sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=4
sizeof(float)=4
sizeof(double)=8
i=8
sizeof(i)=4
sizeof(i)=4
i=8

觀察以上程序需要注意兩點。

(1)i的值并未發(fā)生改變,表明sizeof括號內的表達式并沒有執(zhí)行,sizeof在編譯時求其表達式的運算結果的類型,sizeof運算與運行時無關。sizeof(i)等價于sizeof(int),sizeof(i=5)等價于sizeof(int),也就是說在可執(zhí)行代碼中,并不包含i=5這個表達式,它早在編譯階段就被處理了。
(2)long int是否占8字節(jié),與編譯器的實現有關,Visual C++在VS2012中使用的編譯器是cl.exe,在64bits的Windows下仍然將long編譯為4字節(jié),要想使用8字節(jié)長整型,保險起見,使用long long型。

3.sizeof計算指針變量

指針是C/C++的靈魂,它記錄了一個對象的地址。指針變量的位寬等于機器字長,機器字長由CPU寄存器位數決定。在32位系統(tǒng)中,一個指針變量的返回值為4字節(jié),64位系統(tǒng)中指針變量的sizeof結果為8字節(jié)。

char* pc = "abc";
int* pi=new int[10];
string* ps;
char** ppc = &pc;
void (*pf)(); // 函數指針
char testfunc()
{
return ‘k';
}
sizeof( pc ); // 結果為4
sizeof( pi ); // 結果為4
sizeof( ps ); // 結果為4
sizeof( ppc ); // 結果為4
sizeof( pf ); // 結果為4
sizeof( &testfunc ); // 結果為4
sizeof( testfunc ()); // 結果為1
sizeof(*( testfunc) ()); // 結果為1

考察以上代碼,得出如下結論:

(1)指針變量的sizeof值與指針所指的對象類型沒有任何關系,與指針申請多少空間沒有關系,所有的指針變量所占內存大小均相等。那為什么在本機64bits系統(tǒng)下,指針變量大小仍然是4個字節(jié),因為使用32位編譯器編譯得到程序是32位,故指針大小是4字節(jié),可自行修改編譯器版本,不再贅述。

(2)&testfunc代表一個函數指針,指針大小是4,所以sizeof(&testfunc)==4。testfunc()代表一次函數調用,返回值類型是char,所以sizeof(testfunc())==sizeof(char)==1。testfunc名本身就是一個函數指針,所以(*testfunc)()也是一次函數調用,sizeof((*testfunc)())==sizeof(char)==1。

4.sizeof計算數組

當sizeof作用于數組時,求取的是數組所有元素所占用的大小。參考如下代碼:

int A[3][5];
char c[]="123456";
double*(*d)[3][6];

cout<<sizeof(A)<<endl; //輸出60
cout<<sizeof(A[4])<<endl; //輸出20
cout<<sizeof(A[0][0])<<endl;//輸出4
cout<<sizeof(c)<<endl; //輸出7
cout<<sizeof(d)<<endl; //輸出4
cout<<sizeof(*d)<<endl; //輸出72
cout<<sizeof(**d)<<endl; //輸出24
cout<<sizeof(***d)<<endl; //輸出4
cout<<sizeof(****d)<<endl; //輸出8

考察以上代碼,得出如下結論:
(1)A的數據類型是int[3][5],A[4]的數據類型是int[5],A[0][0]數據類型是int。所以

sizeof(A)==sizeof(int[3][5])==3*5*sizeof(int)==60
sizeof(A[4])==sizeof(int[5])=5*sizeof(int)==20
sizeof(A[0][0])==sizeof(int)==4

盡管A[4]的下標越界,但不會造成運行時錯誤,因為sizeof運算只關心數據類型,在編譯階段就已經完成。

(2)由于字符串以空字符'\0'結尾,所以c的數據類型是char[7],所以sizeof(c)=sizeof(char[7])==7。

(3)d是一個指針,不管它指向的對象是什么數據類型,自身大小永遠是4,所以sizeof(d)==4。sizeof(*d)的數據類型是double*[3][6],所以

sizeof(*d)==sizeof(double*[3][6])==3*6*sizeof(double*)==18*4==72

同理,可以推算出

sizeof(**d)==sizeof(double*[6])==6*sizeof(double*)==24
sizeof(***d)==sizeof(double*)==4
sizeof(****d)=sizeof(double)==8

當數組作為函數形參時,下面的i和j的值應該是多少呢?

void foo1(char a1[3])
{
int i = sizeof( a1 ); // i == ?
}
void foo2(char a2[])
{
int j = sizeof( a2); // j == ?
}

也許當你試圖回答j的值時已經意識到i答錯了,是的,i!=3。這里函數參數a1已不再是數組類型,而是蛻變成指針,相當于char* a1,為什么?仔細想想就不難明白,我們調用函數foo1時,程序會在棧上分配一個大小為3的數組嗎?不會!數組是“傳址”的,調用者只需將實參的地址傳遞過去,所以a1自然為指針類型(char*),i的值也就為4,同樣j也是4。

以上就是詳解C++ sizeof(上)的詳細內容,更多關于C++ sizeof的資料請關注腳本之家其它相關文章!

相關文章

  • C語言樸素模式匹配算法實例代碼

    C語言樸素模式匹配算法實例代碼

    樸素模式匹配算法也稱為布魯特-福斯算法,感覺很是高大上,但是實現起來很簡單。這篇文章主要給大家介紹了關于C語言樸素模式匹配算法的相關資料,需要的朋友可以參考下
    2021-06-06
  • C語言基于回溯算法解決八皇后問題的方法

    C語言基于回溯算法解決八皇后問題的方法

    這篇文章主要介紹了C語言基于回溯算法解決八皇后問題的方法,簡單描述了八皇后問題,并結合實例形式分析了C語言使用回溯算法解決八皇后問題的相關操作技巧,需要的朋友可以參考下
    2018-06-06
  • C語言函數棧幀的創(chuàng)建與銷毀原理圖解

    C語言函數棧幀的創(chuàng)建與銷毀原理圖解

    我們知道c語言中函數都是被調用的,main函數里面能調用其他函數,其實main函數也是被別的函數調用的,下面通過本文給大家分享c語言函數棧幀的創(chuàng)建和銷毀過程,一起看看吧
    2022-05-05
  • 解決Devc++運行窗口中文亂碼的實現步驟

    解決Devc++運行窗口中文亂碼的實現步驟

    本文主要介紹了如何解決Devc++運行窗口中文亂碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C++實現藍橋杯競賽題目---搭積木

    C++實現藍橋杯競賽題目---搭積木

    這篇文章主要介紹了C++實現藍橋杯競賽題目---搭積木,本篇文章通過題目分析列舉公式進行分析算法,包含詳細的圖文,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 給ActiveX簽名的實現方法詳解

    給ActiveX簽名的實現方法詳解

    本篇文章是對給ActiveX簽名的實現方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一篇文章帶你了解C語言函數的可重入性

    一篇文章帶你了解C語言函數的可重入性

    這篇文章主要為大家詳細介紹了C語言函數的可重入性,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 通過stringstream實現常用的類型轉換實例代碼

    通過stringstream實現常用的類型轉換實例代碼

    在本篇文章里小編給大家分享了關于通過stringstream實現常用的類型轉換實例代碼內容,需要的朋友們可以參考下。
    2020-04-04
  • OpenCV實現鼠標在圖像上框選單目標和多目標

    OpenCV實現鼠標在圖像上框選單目標和多目標

    這篇文章主要為大家詳細介紹了OpenCV實現鼠標在圖像上框選單目標和多目標,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C++實現水仙花數判斷實例

    C++實現水仙花數判斷實例

    大家好,本篇文章主要講的是C++實現水仙花數判斷實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01

最新評論