1.函式型別
#include
size_t strlen(const char *s);
size_t sizeof()
2.本質區別
本質上,strlen是函式,而sizeof是算符。strlen需要進行一次函式呼叫,而對於sizeof而言,因為緩衝區已經用已知字串進行了初始化,起長度是固定的,所以sizeof在編譯時計算緩衝區的長度。sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。
3.引申區別
1). strlen計算不包含終止null位元組的字串長度,而sizeof則計算包括終止null位元組的緩衝區長度。
2). strlen只能用char*做引數,且必須是以'/0'結尾的。sizeof可以用型別做引數,還可以用函式做引數。陣列傳遞給strlen就退化為指標了,傳遞給sizeof的引數不退化。
3). 當適用了於乙個結構型別時或變數,sizeof返回實際的大小;當適用一靜態地空間陣列,sizeof 歸還全部陣列的尺寸。sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸
在c/c++裡傳遞陣列永遠都是傳遞指向陣列首元素的指標,編譯器不知道陣列的大小如果想在函式內知道陣列的大小,需要這樣做:
fun(const char *s, int len)
char* buf [len+1];
memcpy(buf, s, len);
5). sizeof操作符不能用於函式型別、不完全型別或位字段。不完全型別是指具有未知儲存大小的資料資料型別,如未知儲存大小的陣列型別,void型別等。
4.sizeof另解
程式儲存分布有三個區域:棧、靜態和動態。所有能夠從**直接操作的物件,包括任何型別的變數、指標,都是在棧上的;動態和靜態儲存區是靠棧上的指標間接操作的。sizeof 操作符,計算的是物件在棧上的投影體積;除了棧上的char陣列這乙個特殊情況之外。。。
sizeof計算的都是型別的長度。如果是物件,則轉換成型別,再計算型別的長度。
在32位系統中。指標型別是32位,4個位元組。所以對任何指標用sizeof結果都是4;
1). 陣列用sizeof = 陣列的步長(型別的長度)*陣列的長度。
2). 復合結構sizeof= 各個資料成員的型別長度*宣告的個數之和。(要考慮到位元組對齊)
typedef struct student
int data;
static int number;
} node1;
typedef struct teacher
int data;
char name;
} node2;
sizeof(node1)=4個位元組。//靜態變數是放在全域性資料區,sizeof計算棧分配的大小,不會計算靜態變數的。
sizeof(node2)=8個位元組。//位元組對齊
3). 引用用 sizeof 。 如果引用的是物件,則先轉化成引用的物件型別。如果是復合型別。則用2。否則直接計算。
sizeof和strlen函式區別
sizeof 是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列 指標 型別 物件 函式等。它的功能是 獲得保證能容納實現所建立的最大物件的位元組大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際上,用sizeof...
關鍵字sizeof 和函式strlen
關鍵字sizeof 用來計算變數或者型別所佔的記憶體大小。函式strlen 用來計算字串的長度 只能用char 做引數 char str 20 helloworld sizeof str 的值是20 strlen str 的值是10 char str helloworld sizeof str 的值...
C語言之 sizeof 和strlen 函式
sizeof 既是乙個關鍵字,還是乙個運算子。而不是乙個函式。sizeof的作用週期是編譯階段。sizeof的作用是用來返回 裡面物件占用的記憶體位元組數。其計算物件型別可以為 資料型別 變數 函式 陣列 指標等 ref strlen是乙個c庫函式 string.h 用來返回乙個字串的長度 注意,字...