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

2021-10-25 00:22:45 字數 3491 閱讀 9356

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...