求陣列長度的兩種方法,以及區別(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
相關文章
- C語言中,當計算字元陣列長度時,用sizeof 和strlen 的原理及兩者的區別C語言字元陣列
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- sizeof與strlen的區別
- sizeof 與 strlen 的區別
- strlen與sizeof的區別
- c語言陣列、sizeof()及strlen()C語言陣列
- C/C++——sizeof和strlen的區別C++
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- C語言中strlen求字串長度,求字元陣列長度(空字元,數字0,字元0,陣列部分初始化)C語言字串字元陣列
- C語言中的strlen與sizeof的區別C語言
- GET和POST兩種基本請求方法的區別
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- C語言中如何求一個陣列的長度C語言陣列
- 指標 與 陣列 以及 a 與 &a的區別指標陣列
- 動態代理的兩種方式以及區別
- 字元陣列的長度字元陣列
- Golang兩種執行流程以及區別Golang
- c語言中計算陣列長度的方法C語言陣列
- 兩種初始化2維陣列方法陣列
- 建立連結串列兩種方法的區別
- C++陣列長度C++陣列
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- 《細說PHP》中strlen和mb_strlen的區別PHP
- 細說PHP中strlen和mb_strlen的區別PHP
- poj 2774 求兩字串的最長公共子串 字尾陣列字串陣列
- 引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別陣列
- C++獲取陣列的長度C++陣列
- Javascript如何改變陣列的長度?JavaScript陣列
- C++中建立物件的兩種方法及其區別C++物件
- 物件陣列與一般陣列的區別物件陣列
- KVO監聽容器類(陣列,字典等)屬性的兩種方法陣列
- C語言求其字元陣列的長度C語言字元陣列
- 203. 長度最小的子陣列陣列
- 整型字元常量和字元字面量的區別 sizeof(char) 和 sizeof('a')字元
- 合併兩個有序陣列,其中有一個陣列長度足夠長,在O(1)的空間複雜度裡進行合併陣列複雜度
- 陣列去重的六種方法陣列
- 遍歷陣列的幾種方法陣列
- 陣列去重的幾種方法陣列