sizeof和strlen的區別:
1 sizeof是運算子,而strlen是函式;
2 sizeof的用法是sizeof(引數),這個引數可以是陣列,指標,型別,物件,甚至是函式,其值在編譯的時候就計算好了,而strlen的引數必須是字元型指標(char*),其值必須在函式執行的時候才能計算出來;
3 sizeof的功能是獲得保證能容納實現的建立的最大物件的位元組的大小,而strlen的功能是返回字串的長度,切記這裡的字串的長度是包括結束符的;
4 當陣列作為引數傳遞給函式的時候,傳的是指標,而不是陣列,傳遞陣列的首位址;
陣列名表示首元素的位址,但是有兩個例外:
(1)sizeof(陣列名),陣列名表示整個陣列,計算的是陣列的總大小,單位是位元組。
(2)&陣列名,陣列名表示整個陣列,取出的是整個陣列的位址。
(3)除(1)(2)之外,所有遇到的陣列名都表示的是數首元素的位址。
int main()
;printf("%d\n", sizeof(a));//16個位元組
printf("%d\n", sizeof(a + 0));//4
printf("%d\n", sizeof(*a));//首元素的位址解引用 4
printf("%d\n", sizeof(a + 1));//4
printf("%d\n", sizeof(a[1]));//4
printf("%d\n", sizeof(&a));//4
printf("%d\n", sizeof(*&a));//16
printf("%d\n", sizeof(&a + 1));//4
printf("%d\n", sizeof(&a[0]));//4
printf("%d\n", sizeof(&a[0] + 1));//4
}
//字元陣列
int main()
; printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr + 0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr + 1));//4
printf("%d\n", sizeof(&arr[0] + 1));//4
printf("%d\n", strlen(arr));//隨機值,不能確定何處取到'\0'
printf("%d\n", strlen(arr + 0));//隨機值
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//隨機值
printf("%d\n", strlen(&arr + 1));//隨機值
printf("%d\n", strlen(&arr[0] + 1));//隨機值
char arr = "abcdef";
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr + 0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4
printf("%d\n", sizeof(&arr + 1));//4
printf("%d\n", sizeof(&arr[0] + 1));//4
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//6,傳進去首元素的位址,從首元素開始數
printf("%d\n", strlen(&arr + 1));//隨機值
printf("%d\n", strlen(&arr[0] + 1));//5
char *p = "abcdef";
printf("%d\n", sizeof(p));//p為乙個指標變數,4個位元組
printf("%d\n", sizeof(p + 1));//4
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1 p[0] == *(p+0)
printf("%d\n", sizeof(&p));//4
printf("%d\n", sizeof(&p + 1));//4
printf("%d\n", sizeof(&p[0] + 1));//4
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p + 1));//5
printf("%d\n", strlen(*p));//err
printf("%d\n", strlen(p[0]));//err
printf("%d\n", strlen(&p));//隨機值
printf("%d\n", strlen(&p + 1));//隨機值
printf("%d\n", strlen(&p[0] + 1));//5
對於二維陣列而言,a[0]代表第一行元素的位址。
//二維陣列
int a[3][4] = ;
printf("%d\n", sizeof(a));//12*4=48
printf("%d\n", sizeof(a[0][0]));//4
printf("%d\n", sizeof(a[0]));//相當於第一行的陣列名,計算整行的大小 4*4=16
printf("%d\n", sizeof(a[0] + 1));// = 4,相當於(陣列名+1),不是特殊情況,即計算第一行第二個元素大小。
printf("%d\n", sizeof(*(a[0] + 1)));//4
printf("%d\n", sizeof(a + 1));//第二行的位址=4
printf("%d\n", sizeof(*(a + 1)));//16
printf("%d\n", sizeof(&a[0] + 1));//4
printf("%d\n", sizeof(*(&a[0] + 1)));//16
printf("%d\n", sizeof(*a));//16
printf("%d\n",sizeof(a[3]));//16
sizeof用法,指標變數和陣列變數
指標變數的sizeof 學過 資料結構的你應該知道 指標是乙個很重要的概念,它記錄了另乙個物件的位址。既然是來存放位址的,那麼它當然等於計算機內部 位址匯流排的寬度。所以在32位計算機中,乙個 指標變數的返回值必定是4 注意結果是以 位元組為單位 可以預計,在將來的 64位系統中指標變數的sizeo...
sizeof 陣列名 和sizeof 指標
在做這道題時 32位環境下,int p new int 10 請問sizeof p 的值為 a 4 b 10 c 40 d 8 我以為正確答案為c,int型別為32位,佔四個位元組,10個自然就是40了,結果正確答案為a,只是指標p佔的空間。因此寫段 測試一下 cpp view plain copy...
sizeof 陣列名 和sizeof 指標
在做這道題時 32位環境下,int p new int 10 請問sizeof p 的值為 a 4 b 10 c 40 d 8 我以為正確答案為c,int型別為32位,佔四個位元組,10個自然就是40了,結果正確答案為a,只是指標p佔的空間。因此寫段 測試一下 cpp view plain copy...