求陣列長度的兩種方法,以及區別(strlen sizeof)

一零 柒發表於2018-04-04

求陣列長度的兩種方法,以及區別(strlen  sizeof)

 

一、sizeof運算子

sizeof(...)是操作符,其定義為:typedef unsigned int size_t;

其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。
它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。
由於在編譯時計算, sizeof不能用來返回動態分配的記憶體空間的大小。所以,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,其返回值跟物件、結構、陣列所儲存的內容沒有關係。

例如在32位計算機中,一個指標變數的返回值必定是4(注意結果是以位元組為單位),但是,在64位系統中指標變數的sizeof結果為8。

 

在sizeof(……)的內部若單獨出現陣列名,則認為該陣列名代表整個陣列。

若出現其他的操作符與陣列名,則陣列名降級為首元素的地址。再進行操作符運算。

a---陣列名單獨出現,代表整個陣列。

&a—表示的是整個陣列的地址(地址的大小為4,單位為位元組。)

解引用 *&a---代表整個陣列的內容

這幾點會在求陣列大小的應用中出現,請大家注意區分。

應用:注意,int的大小為4,單位為位元組。

 

int a[5] = {1,2,3,4};

    printf("%d\n",sizeof(a));//20

a---陣列名單獨出現,代表整個陣列。所以此處的所求的為整個陣列的大小5*4

    printf("%d\n",sizeof(a+0));//4

出現其他的操作符與陣列名,則陣列名降級為首元素的地址。再進行操作符運算。 地址的大小為4個位元組。

    printf("%d\n",sizeof(*&a));//20

    *&a---代表整個陣列的內容,所以為5*4

    printf("%d\n",sizeof(&a+1));//4

   

    char arr[] = "abcdef";

    printf("%d\n", sizeof(arr));//7

    此時所求為整個陣列的大小,注意後面有’\0’結尾。

    printf("%d\n", sizeof(arr+0));//4

二、 strlen函式

strlen作為函式,其引數必須是字元型指標(*char),且必須以‘\0‘ 結尾。否則會一直找,最後輸出隨機值。

功能為:它從記憶體的某個位置開始掃描,直到碰到第一個字串結束符'\0'為止,然後返回計數器值(長度不包含'\0')。

特別的:

陣列名做sizeof的引數不退化,傳遞給strlen就退化為指標了。

在strlen中,陣列名和 &陣列名 均代表首元素的地址。但&陣列名加上其他操作符—代表整個陣列的地址。

(*陣列名)代表指標解引用,為首元素內容。

應用:注意,字元型別大小為1個位元組。

 

char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", strlen(arr));//隨機值

因為在此陣列中沒有’ \0 ’,函式無法知道在哪裡停下來。

printf("%d\n",strlen(&arr+1));//隨機值-6

但&陣列名加上其他操作符—代表整個陣列的地址。再接著執行。跳過整個陣列,所以大小差6

 

char arr[] = "abcdef";

printf("%d\n", strlen(arr));//6

printf("%d\n", strlen(arr+0));//6

三、在指標陣列中的應用

       char *p=arr[ ]=”abcdef”;       指標p指向的是首元素的地址。&p指的是p的地址。

 

printf("%d\n", sizeof(p));//4

此時p為首元素地址,即大小為4個位元組。

printf("%d\n", sizeof(&p));//4

&p指的是p的地址。地址大小為4個位元組。

 

    printf("%d\n", strlen(p));//6

printf("%d\n", strlen(p+1));//5

此時為p為首元素地址,從此開始執行該函式,大小為6個位元組。P+1跳過a,從b開始向後執行函式。

四.二維陣列

       二維陣列與一維陣列同樣的道理,不過再求長度時,可以將arr[ i ][ j ]中的arr[ i ]看作一個整體的一維陣列,在進行運算。

應用:

int a[3][4] = {0};

printf("%d\n",sizeof(a));//48

a---陣列名單獨出現,代表整個陣列。一共有12個元素,每個元素為4位元組。12*4

printf("%d\n",sizeof(*a));//16

二維陣列降級變為一維陣列,成為第一行。所以第一行內容的大小為4*4

printf("%d\n",sizeof(a[3]));//16

表示第三行的陣列長度,元素個數為4,4*4

相關文章