陣列中的strlen和sizeof

2021-08-09 16:15:43 字數 3765 閱讀 1721

先介紹strlen():

strlen()是

函式,要在

執行時才能計算。

引數必須是

字元型指標

(char*

)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。它的功能是:

返回字串的長度

。該字串可能是自己定義的,也可能是記憶體中隨機的,該函式實際完成的

功能是從代表該字串的第乙個位址開始遍歷,直到遇到結束符null。返回的長度大小不包括nul

l。sizeof() 是

運算子,

引數可以是陣列(

編譯時分配的陣列空間大小

)、指標

(儲存該指標所用的空間大小)、

型別(該型別所佔的空間大小)、物件(

物件的實際占用空間大小

)、函式

(函式的返回型別所佔的空間大小,函式的返回型別不能是void

)等。它的

功能是獲得保證能容納實現所建立的最大物件的位元組大小

。關於陣列在使用時的要點:

1.陣列名單獨放在sizeof()內部時,陣列表示整個陣列。

2.&陣列名,陣列名表示整個陣列。ex:&arr表示陣列的位址。

!!!除此之外所有遇到的陣列名引用都是陣列首元素的位址!!!

字元陣列:

int main()

; printf("%d\n", sizeof(arr)); //6 整個陣列大小

printf("%d\n", sizeof(arr + 0)); //4 arr[0]位址大小

printf("%d\n", sizeof(*arr)); //1 arr[0]的大小

printf("%d\n", sizeof(arr[1])); //1 arr[1]的大小

printf("%d\n", sizeof(&arr)); //4 陣列的位址(也是位址)

printf("%d\n", sizeof(&arr + 1)); //4 整個陣列位址+1,跳出陣列,依然是位址

printf("%d\n", sizeof(&arr[0] + 1)); //4 第乙個元素位址+1,代表第二個元素位址

printf("%d\n", strlen(arr)); // 從a的位址開始,遇到\0結束,生成隨機數

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

//printf("%d\n", strlen(*arr)); // strlen()引數必須是字元型指標

//printf("%d\n", strlen(arr[1])); // 同上

printf("%d\n", strlen(&arr)); // 警告!整個陣列的位址,遇到\0結束,生成隨機數

printf("%d\n", strlen(&arr + 1)); // 警告!陣列的位址+1,跳出陣列,依然是遇到\0結束,生成隨機數

printf("%d\n", strlen(&arr[0] + 1)); // 第乙個元素位址+1,第二個元素的位址,遇到\0結束,生成隨機

return 0;

}

字串:

char *p = "abcdef";				//字串 需注意後面有 \0

printf("%d\n", sizeof(p)); //4 指標pa的位址

printf("%d\n", sizeof(p + 1)); //4 a的位址+1,b的位址

printf("%d\n", sizeof(*p)); //1 對a位址的截引用,為char型別大小

printf("%d\n", sizeof(p[0])); //1 a,char型別

printf("%d\n", sizeof(&p)); //4 p字串的頭指標

printf("%d\n", sizeof(&p + 1)); //4 p的指標+1,跳出p,依然為指標

printf("%d\n", sizeof(&p[0] + 1)); //4 首元素位址+1,依然是指標

printf("%d\n", strlen(p)); //6 從a的位址,遇到\0結束,但不包括\0

printf("%d\n", strlen(p + 1)); //5 從b的位址開始,遇到\0結束

//printf("%d\n", strlen(*p)); // 必須為位址

//printf("%d\n", strlen(p[0])); // 同上

printf("%d\n", strlen(&p)); // p的位址,二級指標,有警告,級別不同,生成隨機數

printf("%d\n", strlen(&p + 1)); // p的位址+1,跳出p,二級指標,有警告,級別不同,生成隨機數

printf("%d\n", strlen(&p[0] + 1)); //5 b的位址,從b開始,遇\0結

整形陣列:

int a = ;			

printf("%d\n", sizeof(a)); //16 陣列名單獨放在sizeof中代表整個陣列,求陣列大小,以位元組為單位

printf("%d\n", sizeof(a + 0)); //4 陣列名不是單獨放在sizeof中,代表陣列第乙個元素的位址

printf("%d\n", sizeof(*a)); //4 *為截引用符號,a代表首元素位址,對首元素位址截引用就是首元素,int型別

printf("%d\n", sizeof(a + 1)); //4 a不是單獨在sizeof中,a代表首元素位址,a+1代表第二個為元素位址,指標型別

printf("%d\n", sizeof(a[1])); //4 代表第二個元素,是int型別

printf("%d\n", sizeof(&a)); //4 陣列位址的位址

printf("%d\n", sizeof(&a + 1)); //4 陣列位址+1,就跳出這個陣列的位址,仍然為位址

printf("%d\n", sizeof(&a[0])); //4 對首元素取位址,等價於a

printf("%d\n", sizeof(&a[0] + 1)); //4 首元素位址+1,第二個元素的位址

二維陣列:

int  a[3][4] = ;

printf("%d\n", sizeof(a)); //48 陣列大小

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

printf("%d\n", sizeof(a[0])); //16 把a[0]看成陣列名,單獨在sizeof中,代表整個陣列a[0]

printf("%d\n", sizeof(a[0] + 1)); //4 a[0][1]位址

printf("%d\n", sizeof(a + 1)); //4 第二行位址a[1]

printf("%d\n", sizeof(&a[0] + 1)); //4 對第一行元素取位址,+1後還是位址,等價於a+1

printf("%d\n", sizeof(*a)); //16 a代表第一行元素,*截引用,為第一行元素

printf("%d\n", sizeof(a[3])); //16 越界,但是編譯不佔記憶體,大小為16

指標和陣列中sizeof和strlen的相關筆試題

sizeof和strlen的區別 1 sizeof是運算子,而strlen是函式 2 sizeof的用法是sizeof 引數 這個引數可以是陣列,指標,型別,物件,甚至是函式,其值在編譯的時候就計算好了,而strlen的引數必須是字元型指標 char 其值必須在函式執行的時候才能計算出來 3 siz...

Vector 中size和 capacity的區別

size是指容器當前擁有元素的個數,而capacity是指容器在必須分配新的儲存空間之前可以存放的元素總數。如vectorivect 10 ivect.capacity 10,ivect.size 0,當你向ivect中插入元素時,只要沒有超過十個,那麼capacity就不變,而size為你插入的元...

STL容器中size和capacity的區別

size 表示當前容器中元素的個數 capacity 表示當前容器在必須分配新的儲存空間之前允許存放元素的個數 與size對應的函式是resize n 它的作用是調整容器的大小使其能夠容納n個元素,如果n小於當前容器的size,則刪除多餘的元素。如果n大於當前容器的size,則新增初始化後的元素。r...