當前位置:成語大全網 - 書法字典 - sizeof在c語言中的用法

sizeof在c語言中的用法

Sizeof是C/C++中的壹個運算符,其功能是返回對象或類型占用的內存字節數。返回值類型是size_t,它在頭文件stddef.h中定義

這是壹個取決於編譯系統的值,通常定義為typedef unsigned int size _ t;有許多編譯器,但作為壹種規範,它們都保證char和signed。

char和unsigned char的sizeof值是1,畢竟char是編程中可以使用的最小數據類型。

MSDN的解釋是:

sizeof關鍵字給出了與可用或

類型(包括聚合類型)。該關鍵字返回類型的值

size_t。

2.語法:

Sizeof有三種語法形式,如下所示:

1)sizeof(object);//sizeof(object);

2)sizeof(type _ name);// sizeof(類型);

3)sizeof對象;// sizeof對象;

那麽我們來說三種sizeof,都是正確的。

復制代碼代碼如下:

#包括

主()

{

int b;

printf(“% dn“,sizeof b);

printf(“% dn“,sizeof(b));

printf(“% dn“,sizeof(int));

}

4.基本數據類型的大小

這裏的基本數據類型是指short、int、long、float和double等簡單的內置數據類型,因為它們都是系統。

系統相關,因此不同系統下的值可能不同,這必須引起我們的註意並盡量避免

這壹方面給妳自己程序的移植帶來了麻煩。通常,在32位編譯環境中,sizeof(int)的值為4。

5.指針變量的大小

等於計算機內部地址總線的寬度。因此在32位計算機中,指針變量的返回值必須是4(註意結果是基於

Bytes),可以預見在未來的64位系統中指針變量的sizeof結果將為8。

指針變量的sizeof值與指針所指向的對象無關,只是因為所有指針變量占用相同的內存大小,所以

MFC消息處理函數可以通過使用兩個參數WPARAM和LPARAM(使用

指向結構的指針)。

6.數組的大小

數組的sizeof值等於數組占用的內存字節數,例如:

char a 1【】=“ABC“;

int a2【3】;

sizeof(a 1);//結果為4,字符末尾有壹個空終止符。

sizeof(a2);//結果是3*4=12(取決於int)

Sizeof查找數組元素的數量是錯誤的。有兩種方法可以計算數組元素的個數:int c 1 = sizeof(a 1)。

/sizeof(char);//總長度/單個元素的長度

int C2 = sizeof(a 1)/sizeof(a 1【0】);//總長度/第壹個元素的長度。請註意,數組名稱是作為函數參數傳遞的。

時間退化成指針。

7.結構的尺寸

結構S1

{

char c;

int I;

};

sizeof的結果等於對象或類型占用的內存字節數。好了,我們來看看S1的內存分配情況:S1 s1。

= {‘a‘,0x ffffffff };s1的地址為0x0012FF78,其數據內容如下:

0012f 78:61 CCC cc ff ff ff中間有3個字節。看看關於MSDN的描述:當應用於

結構類型或變量,sizeof返回實際大小,可能

包括用於對齊的填充字節。

這就是字節對齊!為什麽需要字節對齊?計算機組成原理告訴我們,這將有助於加快計算機的數據檢索速度,否則,

這將需要更多的指令周期。因此,編譯器將默認處理該結構(實際上,其他地方的數字

顯示變量),讓基本數據類型(short等。)位於可被2整除的地址,並讓寬度為4的基本數據類型。

數據類型(int等。)都位於可被4整除的地址,依此類推。這樣,兩個數的中間是可能的。

需要添加填充字節,因此整個結構的sizeof值會增加。

1和sizeof是運算符,實際上與加減乘除相同。它們在編譯時執行,而不是在運行時執行。

那麽如果這在編程中得到了驗證呢?

復制代碼代碼如下:

#包括

使用命名空間std

int main()

{

int I = 1;

cout & lt

sizeof(+I);

cout & lt

返回1;

}

輸入結果是1。

1

sizeof中++i的副作用沒有顯示出來,因為只有壹個可能的原因。在編譯時執行sizeof後,處理++i,並消除++i的副作用。如果sizeof是在運行時執行的,則必須註意++I。實際上,sizeof的實現應該使用宏來完成,這些宏在編譯時執行。具體實施可參考以下內容。

2.sizeof(‘a‘)的結果在C語言中為4,在C++中為1。我看過壹篇文章說C中的sizeof側重於數字,而C++中的sizeof更側重於字符。

3.本文討論了sizeof使用宏的兩個經典應用。

復制代碼代碼如下:

//對於非數組

# define _ sizeof(T)((size _ T)(T *)0+1))

//對於數組

# define array _ sizeof(T)((size _ T)(& amp;t+1)(& amp;t)

舉兩個小例子來說明兩個宏的應用。對於第壹種,如_ sizeof(int);結果是4;對於第二個示例,聲明壹個大小為4的數組INTA【4】;那麽array _ sizeof(a)的結果是16。

對於非數組宏定義,首先將0轉換為T*(此時地址為0)類型的指針所指向的地址。然後在T類型的地址上加上1,相當於加上T類型的大小(即非數組T的大小)。前面的size_t只是將地址作為int類型的整數返回。

壹個簡單的例子:int * p;;p = p+1;-p是壹個int*指針,p+1相當於在地址空間中增加了4個字節。

數組的宏定義類似於非數組的宏定義。為了便於理解,這裏可以將數組T視為用戶定義的類型。t代表數組類型的指針,將數組類型的指針加上1相當於將數組大小加上地址。因為它是用戶定義的類型,所以不能強制將0轉換為數組地址。加1後的地址只能減去前壹個地址,差的就是幾個組本身的字節大小。

延伸閱讀:C語言變量理解

首先,變量的概念

程序設計是使計算機按照壹定的指令工作,可以說數據處理是程序設計的主要任務。那麽數據是如何加入計算機內存的呢?計算機的原始功能是可以存儲和處理數據的機器。那麽數據是如何加入計算機內存的呢?在學習編程之前,許多學生可能已經熟悉了計算機的硬件設施。在計算機的硬件設施中有壹個存儲數據的區域,計算機在工作時會頻繁地從這個區域讀入和讀出數據。為了使計算機按照某些指令(程序)自動工作,必須首先將數據存儲在計算機的存儲空間中。在計算機語言中實現這種數據存儲功能的是變量。變量是計算機內存中的存儲單元。

二、變量的定義

C語言中的變量必須在使用前定義。變量定義的壹般形式如下:存儲類別數據類型變量名;其中存儲類別可以省略。

1、存儲類別計算機的內存壹般分為三部分:1)程序區;2)靜態存儲區;3)動態存儲區;為了高效地發揮計算機的功能,不同類型的變量存儲在不同的內存區域中。變量的存儲類別決定了數據在計算機內存中變量的存儲位置。在C語言中,局部變量存儲在動態存儲區中,全局變量或靜態變量存儲在靜態存儲區中。

2.數據類型在用程序處理問題之前,必須首先確定如何描述問題中涉及的數據。這個問題是由C語言中的數據類型決定的。變量的本質是在計算機中的存在時間和存儲空間。變量的數據類型用於確定變量在計算機中占用的內存空間的大小。例如,在TC編譯系統中,整數數據占用兩個字節的存儲空間。C語言變量的類型不僅決定了計算機內存中數據存儲區域的大小,還決定了數據可以參與的各種操作。C語言中的任何變量都必須有明確的數據類型。無論變量如何變化,變量的值都必須符合變量的數據類型。

3、變量的名稱通過上面的介紹,我們知道變量在C語言中是計算機的壹個存儲單元。假設妳給壹個變量賦值,對變量的處理實際上就是對這個數據的處理。那麽計算機如何快速準確地找到這些數據呢?計算機的內存是按字節劃分的。每個儲物單元都有自己的地址號碼,就像酒店房間的房間號碼壹樣。計算機通過地址準確地確定數據的存儲位置。但是對於程序員來說,尤其是非專業的計算機人,用計算機內存地址記錄數據是非常困難的。

為了更好地控制變量,C語言規定可以給每個變量取壹個容易識別的名字。此名稱的命名規則遵循C語言中標識符的命名規則。在遵循C語言標識符規則的前提下,C語言中變量名的命名原則上可以是任意長度的字符組合。但是目前很多C語言編譯系統只能識別前365,438+0個字符。如果兩個變量的前365,438+0個字符相同,編譯系統會認為這兩個變量是同壹個變量。為了避免這種混淆,最好避免使用超過31個字符的變量名。變量是計算機中的存儲單元。定義壹個變量實質上是從計算機中申請壹些存儲區域。該存儲區域的大小由變量的數據類型決定,該存儲區域的位置由變量的存儲類類別決定。給變量賦值實際上是將數據讀入變量對應的存儲單元中,處理變量就是處理這個存儲單元中的數據。並且該存儲單元中的數據可以在程序運行期間改變。