首先,關于數組初始化我将它分為三種:
- 不完全初始化:
剩下的元素預設為0;int arr[5]={1,2,3}
- 未指定數組長度:
int arr[]={1,2,3,4}
- 字元串形式初始化:
char arr[]='abcd'
可能其中有兩種初始化容易搞混,一是字元數組:char arr[4]={'a','b','c','d'};一是初始化為字元串的數組:char arr[4]='abcd'。
其實,第二種以字元串形式出現的,編譯器都會為該字元串自動添加一個0作為結束符,如在代碼中寫 "abc",那麼編譯器幫你存儲的是"abc/0",char arr[]="abc"實際上存儲的是 char arr[]={'a','b','c','\0'}',還是屬于字元數組。
弄清楚char arr[4]={'a','b','c','d'};char arr[4]='abcd'的差別後, 接下來講講sizeof和strlen的作用和差別。
sizeof()”運算符求的是字元數組的長度,而不是字元串長度。隻跟你給該字元串數組定義了多大空間有關,而跟字元串是否結束無關.如果遇到字元串,編譯時會自動在末尾增加一個 null 字元,即char arr1[]='abc\0'。
strlen:用來計算以’\0’結尾的字元串長度的函數。它并不是計算記憶體大小,僅計算字元串從開端到’\0’結尾字元的個數(不包含’\0’)。
舉個栗子:
1.1 一維數組
1.1.1 sizeof()問題
(1)整形數組
(2)字元數組
(3)初始化為字元串的數組
總結:
一個指針(或者說數組/數組元素位址)的大小在32位平台是4,64位平台是8。原因:在32位cpu上,指針能夠存儲這2^32次個位址就需要4個位元組。(1位元組=8位),64位同理;
1. 求位址的大小(數首元素位址,下一個元素位址,整個數組位址,下一個數組位址...)都是4/8位元組。
2. 求元素的大小,就看是整形還是字元,整形4個位元組,字元型1個位元組。
3. 不分char,int等類型,隻要是求位址大小,都是4/8。
1.1.2 strlen()問題
(1)字元數組
(2)初始化為字元串的數組
總結:
C 庫函數 size_t strlen(const char \*str) **接收的類型是位址char \***,從給定位址**往後尋找,從給定直到空結束字元**(不包括空結束字元),然後傳回字元串 str 的長度。
如果傳給strlen()的參數是未可知範圍的位址,strlen會**一直走下去,直到遇到"\0"為止**,‘\0’出現位置是未知的,結果就是随機值(如char arr[]={'a','b','c'},strlen(arr) 随機);
如果傳給strlen()的位址後面會出現'\0',那麼就傳回字元串的長度(char arr[]=“abc”,strlen(arr) =6);
如果傳給strlen的參數是一個具體的元素而不是一個位址,這樣會把字元a的ascii碼值97傳給strlen函數,而此函數是通路不到這個位址的,是以會程式中斷。(char arr[]={'a','b','c'},strlen(*arr) 報錯)。
以上。