sizeof用法,c sizeof用法

時間 2021-10-17 02:36:57

1樓:吉祥二進位制

在c語言中sizeof是一個運算子,確切的說是一個編譯時的運算子,它負責獲取資料型別或者變數所佔的記憶體位元組。使用方法也很簡單,後面接資料型別或者變數名。比如:

int i = sizeof(int); //獲取 int資料型別所佔的記憶體位元組數

int j = sizeof(i ); //獲取變數i所佔的記憶體位元組數。

在操作變數時,也可以不用加括號,上面的示例等同於:

int j = sizeof  i;

2樓:傅邃出好

4bit+4bit==1byte

sizeof(short)==

2bytes

sizeof(long)

==4bytes

answeris7

bytes

我用linux

gcc編譯器在32位機上編譯結果大小為8,以上使我亂猜的...。

linux的想法和你的一樣,windowsvc++編譯器的想法我們就不曉得了

3樓:匿名使用者

所有的指標的大小都是4,不管什麼型別。

我們通常用sizeof去求某型別的size,比如內建型別int,char,float,double...

也有自定義型別如struct,class.

陣列也可以 char a[10]; sizeof(a);

但是就是不能是指標。

對於字串,大小我們通常都是使用strlen來求得的。

4樓:匿名使用者

s是這個指標變數

sizeof(s)是求這個指標的地址所佔空間所以是4個位元組

如果sizeof(*s)是你所說的...

c++ sizeof用法

5樓:閃亮登場

一、由幾個例子說開去。

第一個例子:

char* ss = "0123456789";

sizeof(ss) 結果 4 ===》ss是指向字串常量的字元指標

sizeof(*ss) 結果 1 ===》*ss是第一個字元

char ss = "0123456789";

sizeof(ss) 結果 11 ===》ss是陣列,計算到\0位置,因此是10+1

sizeof(*ss) 結果 1 ===》*ss是第一個字元

char ss[100] = "0123456789";

sizeof(ss) 結果是100 ===》ss表示在記憶體中的大小 100×1

strlen(ss) 結果是10 ===》strlen是個函式內部實現是用一個迴圈計算到\0為止之前

int ss[100] = "0123456789";

sizeof(ss) 結果 400 ===》ss表示再記憶體中的大小 100×4

strlen(ss) 錯誤 ===》strlen的引數只能是char* 且必須是以''\0''結尾的

char q="abc";

char p="a\n";

sizeof(q),sizeof(p),strlen(q),strlen(p);

結果是 4 3 3 2

第二個例子:

class x

;x x;

cout<

cout<

第三個例子:

char szpath[max_path]

如果在函式內這樣定義,那麼sizeof(szpath)將會是max_path,但是將szpath作為虛參宣告時(void fun(char szpath[max_path])),sizeof(szpath)卻會是4(指標大小)

二、sizeof深入理解。

1.sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。

2.sizeof是算符,strlen是函式。

3.sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。sizeof還可以用函式做引數,比如:

short f();

printf("%d\n", sizeof(f()));

輸出的結果是sizeof(short),即2。

4.陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。

5.大部分編譯程式在編譯的時候就把sizeof計算過了是型別或是變數的長度這就是sizeof(x)可以用來定義陣列維數的原因

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

6.strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。

7.sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式。

8.當適用了於一個結構型別時或變數, sizeof 返回實際的大小, 當適用一靜態地空間陣列, sizeof 歸還全部陣列的尺 寸。 sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸

9.陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首地址,如:

fun(char [8])

fun(char )

都等價於 fun(char *) 在c++裡傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小如果想在函式內知道陣列的大小,需要這樣做:進入函式後用memcpy拷貝出來,長度由另一個形參傳進去

fun(unsiged char *p1, int len)

有關內容見: c++ primer?

10.計算結構變數的大小就必須討論資料對齊問題。為了cpu存取的速度最快(這同cpu取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),c++在處理資料時經常把結構變數中的成員的大小按照4或8的倍數計算,這就叫資料對齊(data alignment)。

這樣做可能會浪費一些記憶體,但理論上速度快了。當然這樣的設定會在讀寫一些別的應用程式生成的資料檔案或交換資料時帶來不便。ms vc++中的對齊設定,有時候sizeof得到的與實際不等。

一般在vc++中加上#pragma pack(n)的設定即可.或者如果要按位元組儲存,而不進行資料對齊,可以在options對話方塊中修改advanced compiler頁中的data alignment為按位元組對齊。

11.sizeof操作符不能用於函式型別,不完全型別或位欄位。不完全型別指具有未知儲存大小的資料型別,如未知儲存大小的陣列型別、未知內容的結構或聯合型別、void型別等。

如sizeof(max)若此時變數max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [max]且max未知,sizeof(void)都不是正確形式

三、結束語

sizeof使用場合:

1.sizeof操作符的一個主要用途是與儲存分配和i/o系統那樣的例程進行通訊。例如:

void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,file * stream)。

2.用它可以看看一型別的物件在記憶體中所佔的單元位元組。

void * memset(void * s,int c,sizeof(s))

3.在動態分配一物件時,可以讓系統知道要分配多少記憶體。

4.便於一些型別的擴充,在windows中就有很多結構內型就有一個專用的欄位是用來放該型別的位元組大小。

5.由於運算元的位元組數在實現時可能出現變化,建議在涉及到運算元位元組大小時用sizeof來代替常量計算。

6.如果運算元是函式中的陣列形參或函式型別的形參,sizeof給出其指標的大小。

6樓:weida愛問

int a;    ///sizeof(a)  就是求變數a所佔的記憶體

int &b=a;  // 定義引用b,並讓他指向a,那麼sizeof(b)  ==sizeof(a)

int *p = &a ; ///sizeof(p), 變數p所佔的記憶體,指標變數在32位系統中都是4個位元組

///如果是sizeof( * p ) 變數p所指向的變數所佔的記憶體, 也就是sizeof( a)

希望幫到你,望及時採納!

7樓:

char* crname = "xiaowang";

返回的是xiaowang這個字串在記憶體中佔用的空間大小。

int iptrlen = sizeof(crname);// 返回的是指向xiaowang這個字串的指標的大小。跟xiaowang這個字串沒有關係。

char *pszresult = (char*)malloc(sizeof(char) * cch);//使用最多的方式。取某個型別單個元素的位元組。

tchar szhresult[1024];

::zeromemory(szhresult, sizeof(szhresult));//獲取整個字元陣列的位元組, 相當於1024*sizeof(tchar)

c語言中,sizeof運算子有什麼作用?

8樓:哇哎西西

sizeof運算子

該運算子在編譯階段就已經起作用了。它以位元組為單位返回其運算元的大小。它的運算元可以是資料物件也可以是一個型別。如果是型別那麼運算元需要用圓括號括起來。

如:sizeof(int)=4;

擴充套件資料:

c語言其他運算子:

1、取模運算子%

該運算子有個特性就是隻支援整數運算。它的作用就是用左邊的運算元除以右邊的運算元得到的餘數。它對浮點數其他型別不起作用。

如:11%2=1因為11除以2得5餘1

2、自增自減運算子++/--

這種運算子的基本作用就是讓其運算元增加1或者減去1。這種運算子有兩種模式:字首模式和字尾模式。

字首模式:運算子放在運算元的前面,在表示式中求值時先將運算元進行加1或者減1操作然後再參與運算。

字尾模式:運算子放在運算元的後面,在表示式中求值時先將運算元參與運算然後再對運算元進行加1或者減1操作。

3、三目運算子?:

顧名思義就是三個運算元的運算子,它的用法時當問號前面的表示式的值為真時,取值為冒號前面的數值,否則取值為冒號後面的數值。由於它的執行效率較高,常被我們用來代替條件語句。

如:x>1?2:3;這句話的意思就是當x的值大於1時,整個表示式的值為2,否則為3。

程式設計實現sizeof的功能來計算int型資料的位元組數

char a 1 把a移動一個型別位元組數,轉換為指向char型別的指標後以char型的1位元組計數,而轉化為指向int的指標後以4位元組為單位計數.說實在話sizeof是不可能實現的,那個是一個關鍵字,本來就沒有幾個關鍵字。為什麼要設定一個這個東西呢?你這個函式不管寫成什麼樣,都是幾乎固定的返回一...

c語言中sizeof的意思是什麼下面這道題的答案是什麼,請解

高金山 上面這麼多朋友都在亂說,不怕誤導別人啊?vc環境下的答案是124 tc環境下是64,因為int在vc下佔4位元組,而在tc下佔2位元組 sizeof struct date 12 year,month和day每個佔4位元組,所以結構體today佔用3 4 12位元組 sizeof m 4 a...

c語言中sizeof是什麼意思,C語言中sizeof是什麼意思

肥仙女 sizeof是c語言中保留關鍵字,也可以認為是一種運算子,單目運算子。常見的使用方式 int a 10 int arr 1,2,3 char str hello int len a sizeof a int len arr sizeof arr 結果是 len a 4,len arr 12,...