1. 程式人生 > >sizeof與strlen區別及用法

sizeof與strlen區別及用法

1、sizeof的定義--本身是操作符不是函式

        1.1、你可以把操作符理解為內建的,最基礎的函式,它們無法完全被若干個未使用同類型操作符的函式所替代。比如加法運算子,你就不可能寫出一個不用+或-的函式來實現任何情況下的加法功能。

        1.2、運算子(是操作符的一種)和函式還有一個重要區別。函式本身有一段程式碼,程式執行時,遇到函式時,會先將函式的引數入棧,再跳到函式的程式碼來執行。而操作符則是在本地直接運算。

2、sizeof的語法

2.1. 語法:sizeof有三種語法形式,如下:

           1) sizeof( object ); // sizeof( 物件 );

2) sizeof( type_name ); // sizeof( 型別 );

3) sizeof object; // sizeof 物件;

2.2 傳入引數(只說重要的陣列和結構體)

2.2.1 陣列的sizeof值等於陣列所佔用的記憶體位元組數

char *str1="absde";

char str2[]="absde";
char str3[8]={'a',};
char ss[] = "0123456789";

輸出:

sizeof(str1)=4
sizeof(str2)=6;         //sizeof算上\0
sizeof(str3)=8;
sizeof(ss)=11;

首先說明一點,char型別佔一個位元組,所以sizeof(char)是1,這點要理解

str1是一個指標,只是指向了字串"absde"而已。所以sizeof(str1)不是字串佔的空間也不是字元陣列佔的空間,而是一個字元型指標佔的空間。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一個指標佔4個位元組

str2是一個字元型陣列。C/C++規定,對於一個數組,返回這個陣列佔的總空間,所以sizeof(str2)取得的是字串"absde"佔的總空間。"absde"中,共有a b s d e \0六個字元,所以str2陣列的長度是6,所以sizeof(str2)=6*sizeof(char)=6

str3已經定義成了長度是8的陣列,所以sizeof(str3)為8

str4和str2類似,'0' '1' ... '9'加上'\0'共11個字元,所以ss佔的空間是11

總之,對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;而對於一個數組,sizeof返回這個陣列所有元素佔的總空間。

char* str1與char str1[]容易混淆,一定要分清

        寫到這裡,提一問,下面的c3,c4值應該是多少呢

        void foo3(char a3[3])       //傳參時,陣列是“傳地址”

        {

                int c3 = sizeof( a3 ); // c3 == 4

        }

        void foo4(char a4[ ])       //傳參時,形參不需要指定陣列大小,因為陣列是“傳地址”,定義時需要指

        {

                int c4 = sizeof( a4 ); // c4 == 4

        }

        這裡函式引數a3已不再是陣列型別,而是蛻變成指標,相當於char* a3,為什麼仔細想想就不難明白,我們呼叫函式foo1時,程式會在棧上分配一個大小為3的陣列嗎不會!陣列是“傳址”的,呼叫者只需將實參的地址傳遞過去,所以a3自然為指標型別(char*),c3的值也就為4。

2.2.2 結構體的sizeof,這也是我寫這篇部落格的原因

                (1)這裡涉及到一個重要的知識點——位元組對齊

                   解釋:為什麼需要位元組對齊?計算機組成原理,因為儲存器硬體構成與計算機指令之間的配合,考慮到為了方便儲存器硬體製造和使指令更精簡兩方面,所以位元組對齊訪問有助於加快計算機的取數速度,否則就得多花指令週期了

                            為此,編譯器預設會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的地址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。

        (2)需要了解更多關於結構體的請參考博主如下,這裡只是針對我自己的需要寫的

3 strlen(const char *s)

(1)sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''\0''結尾的。

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

char *str1="absde";

strlen(str1) 等於5

char str3[8]={'a',};

strlen(str3) 等於1   因為遇到\0就返回,

參考博主:https://blog.csdn.net/wzy198852/article/details/7246836