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測試的是字串的長度。在定義陣列時,字串後面還有乙個結...