stlen sizeof聯絡與區別

2021-06-06 14:39:20 字數 3827 閱讀 1879

#include "stdio.h"

#include "string.h"

int main()

程式執行的結果是strlen(aa)=15;sizeof(aa)=10,這是怎麼回事呢?strlen是有效字串的長度,不含'/0',與初始化有關係,而sizeof與初不初始化無關係,下面看看他們區別吧

strlen(char*)函式求的是字串的實際長度,它求得的方法是從開始遇到第乙個'/0',如果你只定義而沒有給它賦初值,這個結果是不定的,它會一直找下去,直到遇到'/o'為止。

char aa[10];cout<

char aa[10]=cout<

char aa[10]="jun";cout<

而sizeof()函式返回的是變數宣告所佔的記憶體數,不是實際長度

sizeof(aa)=10;

int a[10];sizeof(a)=40

1sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int 型別

該型別所保證能容納實現所建立的最大物件的位元組大小

2sizeof是算符,strlen是函式

3strlen只能用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

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

的大小7sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧,這是因為sizeof是個操作 

符而不是函式

8當適用了於乙個結構型別時或變數,sizeof 返回實際的大小,當適用一靜態的空間陣列,

sizeof歸還全部陣列的尺寸,sizeof操作符不能返回動態的被分配了的陣列或外部陣列的尺

寸9陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址

fun(char [8])

fun(char [ ])

都等價於fun(char*)在c++裡引數傳遞陣列永遠都是傳遞陣列首元素的指標,編譯器不知 

道陣列的大小,如果想在函式內知道陣列的大小,需要這樣做:需要這樣做:進入函式後用 

memcpy拷貝出來,長度由另乙個形參傳進去

fun(unsigned char* p1,int len)

我們能常在用到sizeof和strlen的時候,通常是計算字串陣列的長度

看了上面的解釋,發現兩者的使用是有區別的,從這個例子可以看清楚

char str[20]="0123456789";

int a=strlen(str);//a=10計算字串的長度,以結束符ox00為字串結束符

int b=sizeof(str);//b=20 計算的是分配的陣列str所佔的記憶體空間的大小,不受裡面儲存的內容改變

上面是對靜態陣列處理的結果,如果是對指標,結果就不一樣了

char* ss="0123456789";

sizeof(ss)結果4------》ss是指向字串常量的字元指標,sizeof獲得的是乙個指標所佔的記憶體,應該是長整型的,所以是4

sizeof(*ss)結果是1,------》*ss是第乙個字元,其實就是獲得了字串的第一位『0』所佔的記憶體空間,是char型的,佔了1位

strlen(ss)=10---->如果要獲得這個字串長度,則一定要使用strlen

sizeof返回物件所占用的位元組大小,//正確

strlen返回字串個數//正確

在使用sizeof時,  有乙個特別的情況,就是陣列名到指標蛻變

char arrag[3]=;

sizeof(array)=3;

char* p=array;

sizeof(p)=4//sizeof(p)結果為4

在傳遞乙個陣列名到乙個函式中時,它會完全退化為乙個指標

看完以上例子,你是否明白sizeof和strlen區別呢?如果還不明白,看下面的例子

char* ss="0123456789";

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

sizeof(*ss)結果為1,-----》*ss是第乙個字元

大部分編譯程式 在編譯的時候把sizeof計算過了是型別還是變數的長度

這就是sizeof(x)可以用來定義陣列維位數的原因

char str[20]="0123456678";

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

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

char ss="0123456789";

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

sizeof(*ss)結果為1,*ss是第乙個字元

char ss[100]="0123456789";

sizeof(ss)結果為100,ss表示在記憶體中的大小 100x1

strlen(ss)結果為10,strlen是個函式內部實現是用乙個迴圈計算/0為止之前

int ss[100]="0123456789";

sizeof(ss)結果為400,ss表示記憶體中的大小,100x4

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

char q="abc";

char p="a/n";

sizeof(p),sizeof(q),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只要抓住乙個點:棧

程式儲存分布有三個區域:棧,靜態,動態,能夠從**直接操作的物件,包括任何型別的變數,指標都是在棧上的,動態和靜態儲存區是靠棧上的所有指標間接操作的, sizeof 操作符,計算的是物件在棧上的投影體積,記住這個東西就很清楚了

char const * static_string ="hello";

sizeof(static_string)是sizeof乙個指標,所有在32 bit system 是4

char static_string="hello";

sizeof(stratic_string)是sizeof的乙個陣列,所以6*sizeof(char)

char *string=new char[6];

strncpy(string,""hello",6")

sizeof(string)是sizeof乙個指標,所以還是4,不同的是這個指標指向了動態儲存區而不是靜態儲存區

c++中對引用的處理比較特殊,sizeof乙個引用得到的結果是sizeof乙個被引用的物件的大小,所以

struct

;int main()

r引用的是整個0物件而不是指向0的指標,所以sizeof 0和sizeof r完全相同

return,yield,print聯絡與區別

看到一道題,return和yield有什麼區別,所以就連著print一起寫一下吧 print return yield都有列印的功能 首先看一下 以及輸出 def do print for i in range 1,5 print i print do print print 這是一條分割線 def...

Atitit 事件機制 與 訊息機制的聯絡與區別

atitit.事件機制 與 訊息機制的聯絡與區別 1 訊息 事件機制是幾乎所有開發語言都有的機制,在某些語言稱之為訊息 event 有些地方稱之為 message 12 發布 訂閱模式13 事件 是侵入式設計,霸佔你的主迴圈 訊息是非侵入式設計,將主迴圈該怎樣設計的自由留給使用者。13 1.事件越如...

《常用的機器學習演算法 SVM與LR的聯絡和區別》

上面那篇文章,簡單的總結了李航老師 統計機器學習 上面的svm的問題。其中軟間隔的svm主要指的是對那些線性不可分的樣本集構建svm分類的問題,允許一定的誤分類,所以優化問題引入了引數c 作為懲罰因子,c越大懲罰越大允許的錯誤越小。但是直接使用0 1損失函式的話其非凸 非連續,數學性質不好優化起來比...