#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損失函式的話其非凸 非連續,數學性質不好優化起來比...