C語言 sizeof和strlen的計算

2021-08-20 02:44:43 字數 4069 閱讀 6197

sizeof是乙個關鍵字,求字串所佔的位元組數。

printf("%d\n", sizeof(int));

printf("%d\n", sizeof(a));

printf("%d\n", sizeof a);

strlen是乙個函式,求字串的長度,結束符\0之前的字元個數。

看一下下面幾組練習:

**一維陣列**

int a = ;

printf("%d\n", sizeof(a)); //16 sizeof(陣列名)表示整個陣列大小

printf("%d\n", sizeof(a + 0)); //4 首元素位址

printf("%d\n", sizeof(*a)); //4 首元素位址解引用拿到第乙個元素1,int型

printf("%d\n", sizeof(a + 1));//4 首元素位址+1指向第二個元素位址

printf("%d\n", sizeof(a[1])); //4 第二個元素

printf("%d\n", sizeof(&a)); //4 取整個陣列的位址,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 第二個元素的位址

**字元陣列**

char arr = ;

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

printf("%d\n", sizeof(arr + 0));//4 首元素位址

printf("%d\n", sizeof(*arr)); //1 首元素位址解引用拿到第乙個元素1,char型

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", sizeof(*&arr));//6 陣列位址解引用訪問整個陣列

printf("%d\n", strlen(arr)); //隨機值x

printf("%d\n", strlen(arr + 0)); //隨機值x

printf("%d\n", strlen(*arr)); //錯誤,*arr取的是a的ascii碼值97,在去訪問位址為97的這塊空間,不允許訪問

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

printf("%d\n", strlen(&arr)); //隨機值x

printf("%d\n", strlen(&arr + 1)); //隨機值x-6

printf("%d\n", strlen(&arr[0] + 1));//隨機值x-1

char arr = "abcdef";

printf("%d\n", sizeof(arr)); //7 表示整個陣列大小 abcdef\0

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", sizeof(*&arr));//7 陣列位址解引用訪問整個陣列

printf("%d\n", strlen(arr)); //6

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

printf("%d\n", strlen(*arr)); //錯誤

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

printf("%d\n", strlen(&arr)); //6 取首位址

printf("%d\n", strlen(&arr + 1)); //隨機值

printf("%d\n", strlen(&arr[0] + 1));//5 從第二個元素數直到\0

char *p = "abcdef";

printf("%d\n", sizeof(p)); //4 p是乙個指標

printf("%d\n", sizeof(p + 1));//4 第二個元素b的位址

printf("%d\n", sizeof(*p)); //1 p中存放了a的位址,解引用找到a,a是char型別的

printf("%d\n", sizeof(p[0])); //1 第二個元素大小,相當於*(p+0)

printf("%d\n", sizeof(&p)); //4 取指標變數p的位址

printf("%d\n", sizeof(&p + 1));//4

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

printf("%d\n", strlen(p));//6 遇到\0停止

printf("%d\n", strlen(p + 1)); //5 p+1指向b這個元素,從b開始往後走遇到\0就停下

printf("%d\n", strlen(*p)); //錯誤

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

printf("%d\n", strlen(&p));//隨機值

printf("%d\n", strlen(&p + 1));//隨機值

printf("%d\n", strlen(&p[0] + 1));//5 第乙個元素位址+1指向第二個元素位址,從b開始往後走遇到\0就停下,跟strlen(p + 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]第一行陣列的大小

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

printf("%d\n", sizeof(a + 1)); //4 降級為首元素位址(第一行位址)跳過16個位元組到第二行的位址

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

printf("%d\n", sizeof(*a)); //16 降級為首元素位址(第一行位址)解引用

printf("%d\n", sizeof(a[3]));//16 sizeof()內部表示式不計算,陣列名單獨放在sizeof內部跟第一行陣列大小一樣還是16個位元組

以下三點要好好記住並理解含義:

1.

sizeof(陣列名)————陣列名表示整個陣列,求整個陣列大小,單位:位元組

2.&陣列名————取整個陣列的位址

3.除此之外,所有遇到的陣列名都是首元素位址

strlen(arr),引數是位址,從這個位址往後找遇到\0停止。

關於C語言sizeof運算子和strlen 函式

c primer plus總結 1.不同點 sizeof運算子是以位元組為單位返回運算子物件的大小 strlen 函式給出字串中的字元長度 2.相同點 sizeof運算子和strlen 函式返回型別可以用 zd轉換 不識別 zd,嘗試換成 u或者 lu sizeof運算子和strlen 函式返回的實...

C語言的sizeof和strlen

strlen是函式,而sizeof是算符。strlen需要進行一次函式呼叫,而對於sizeof而言,因為緩衝區已經用已知字串進行了初始化,其長度是固定的,所以sizeof在編譯時計算緩衝區的長度。strlen是遇到0或者 0 都會停止運算的,而sizeof是每個字元都會算的,不會漏掉0 或者 0 因...

C語言的sizeof和strlen

strlen是函式,而sizeof是算符。strlen需要進行一次函式呼叫,而對於sizeof而言,因為緩衝區已經用已知字串進行了初始化,起長度是固定的,所以sizeof在編譯時計算緩衝區的長度。因為sizeof 測試的是陣列的長度。而strlen測試的是字串的長度。在定義陣列時,字串後面還有乙個結...