先介紹strlen():
strlen()是函數,要在運作時才能計算。參數必須是字元型指針(char*)。當數組名作為參數傳入時,實際上數組就退化成指針了。它的功能是:傳回字元串的長度。該字元串可能是自己定義的,也可能是記憶體中随機的,該函數實際完成的功能是從代表該字元串的第一個位址開始周遊,直到遇到結束符NULL。傳回的長度大小不包括NULL。
sizeof() 是運算符,參數可以是數組(編譯時配置設定的數組空間大小)、指針(存儲該指針所用的空間大小)、類型(該類型所占的空間大小)、對象(對象的實際占用空間大小)、函數(函數的傳回類型所占的空間大小,函數的傳回類型不能是void)等。它的功能是獲得保證能容納實作所建立的最大對象的位元組大小。
關于數組在使用時的要點:
1.數組名單獨放在sizeof()内部時,數組表示整個數組。
2.&數組名,數組名表示整個數組。ex:&arr表示數組的位址。
!!!除此之外所有遇到的數組名引用都是數組首元素的位址!!!
字元數組:
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
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[] = { 1, 2, 3, 4 };
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] = { 0 };
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