求陣列長度的兩種方法,以及區別(strlen sizeof)
求陣列長度的兩種方法,以及區別(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
相關文章
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- sizeof與strlen的區別
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- GET和POST兩種基本請求方法的區別
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- 動態代理的兩種方式以及區別
- Golang兩種執行流程以及區別Golang
- 字元陣列的長度字元陣列
- c語言中計算陣列長度的方法C語言陣列
- 建立連結串列兩種方法的區別
- 《細說PHP》中strlen和mb_strlen的區別PHP
- 引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別陣列
- C++陣列長度C++陣列
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- 物件陣列與一般陣列的區別物件陣列
- KVO監聽容器類(陣列,字典等)屬性的兩種方法陣列
- 遍歷陣列的幾種方法陣列
- 陣列去重的幾種方法陣列
- 陣列去重的六種方法陣列
- C++獲取陣列的長度C++陣列
- 203. 長度最小的子陣列陣列
- Javascript如何改變陣列的長度?JavaScript陣列
- golang切片和陣列的區別Golang陣列
- JS 兩組陣列取不同值組成新陣列的方法JS陣列
- PHP 中的陣列相加操作以及與 array_merge 之間的區別PHP陣列
- 【淺出 PHP】陣列相加和陣列合並的區別PHP陣列
- 玩轉陣列各種方法陣列
- 分割陣列的幾種方法比較陣列
- JS陣列去重的10種方法JS陣列
- JS陣列去重的幾種方法JS陣列
- leetcode_209. 長度最小的子陣列LeetCode陣列
- LeetCode-209-長度最小的子陣列LeetCode陣列
- 【LeetCode】209. 長度最小的子陣列LeetCode陣列
- 合併兩個有序陣列,其中有一個陣列長度足夠長,在O(1)的空間複雜度裡進行合併陣列複雜度
- 三種方法實現strlen函式函式
- C#陣列與集合的區別C#陣列
- has(),find()以及filter()方法的區別Filter
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標