先介紹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...