c語言深刻理解sizeof和strlen
- 一、sizeof和strlen是什么?
- 二、案例分析
- Part 1
- Part 1.1 sizeof在一維陣列中的運用
- Part 1.2 sizeof在二維陣列
- Part 2
- Part 2.1 sizeof與strlen在字符陣列
- Part 2.2 sizeof與strlen在字串
- 總結
一、sizeof和strlen是什么?
sizeof是運算子關鍵字不是函式,功能是回傳一個變數或者型別的大小,
而strlen是庫函式,函式求的是字串的長度,
二、案例分析
在看下面的案例前先要理解下面幾句話,才好進行下面案例的環節:
1.陣列名單獨放在sizeof()內部,陣列名表示整個陣列,計算的是整個陣列的大小,單位是位元組
2.&陣列名,陣列名表示整個陣列,取出的是整個陣列的地址
除上面2種情況之外,所有的陣列名都是陣列首元素的地址
Part 1
Part 1.1 sizeof在一維陣列中的運用
//1.一維陣列
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); // sizeof(a)==16---陣列名單獨放在sizeof內部,計算的是陣列總大小
printf("%d\n", sizeof(a + 0)); // sizeof(a + 0)==4/8---a+0是第一個元素的地址
printf("%d\n", sizeof(*a)); // sizeof(*a)==4---*a就是陣列a的首元素
printf("%d\n", sizeof(a + 1)); // sizeof(a + 1)==4/8---a+1是陣列第二個元素的地址
printf("%d\n", sizeof(a[1])); // sizeof(a[1])==4---a[1]就是陣列的第二個元素
printf("%d\n", sizeof(&a)); // sizeof(&a)==4/8---&a是陣列的地址,但是只要是地址就是4/8個位元組
printf("%d\n", sizeof(*&a)); // sizeof(*&a)==16---sizeof(*&a)==sizeof(a),計算的是陣列總大小
printf("%d\n", sizeof(&a+1)); // sizeof(&a + 1)==4/8---是一個地址,指向的是陣列之后的空間
printf("%d\n", sizeof(&a[0])); // sizeof(&a[0])==4/8---是首元素地址
printf("%d\n", sizeof(&a[0]+1)); // sizeof(&a[0] + 1)==sizeof(a[1])==4/8---是陣列第二個元素的地址
Part 1.2 sizeof在二維陣列
//3.二維陣列
int a[3][4] = { 0 };
//printf("%p\n", &a[0][0]);
//printf("%p\n", a[0]+1);
//對于二維陣列,陣列名單獨放在sizeof內部,陣列名表示整個陣列,計算的是整個陣列的大小
printf("%d\n", sizeof(a)); // sizeof(a)==48
printf("%d\n", sizeof(a[0][0])); // sizeof(a[0][0])==4
printf("%d\n", sizeof(a[0])); // sizeof(a[0])==16---a[0]是第一行的陣列名,第一行的陣列名單獨放在sizeof內部
// 計算的是第一行這個陣列的總大小
printf("%d\n", sizeof(a[0] + 1)); // sizeof(a[0] + 1)==4/8---arr[0]作為第一行的陣列名,并沒有單獨放在sizeof內部
// 所以陣列名相當于陣列首元素的地址,就是第一行第一個元素的地址
// a[0]+1---是第一行第二個元素的地址
printf("%d\n", sizeof(*(a[0] + 1))); // sizeof(*(a[0] + 1))==4---第一行第二個元素的大小
printf("%d\n", sizeof(a + 1)); // sizeof(a + 1)==4/8---a作為二維陣列的陣列名,并沒有&,也沒有單獨放在sizeof內部
// 那么陣列名a就是首元素(第1行)的地址
// 所以a+1,也就是第2行的地址
printf("%d\n", sizeof(*(a + 1))); // sizeof(*(a + 1))==16---第二行的大小 *(a+1)==a[1]
printf("%d\n", sizeof(&a[0] + 1)); // sizeof(&a[0] + 1)==4/8---&arr[0]是第一行的地址,+1就是第二行的地址
printf("%d\n", sizeof(*(&a[0] + 1))); // sizeof(*(&a[0] + 1))==16---計算的是第二行的大小
printf("%d\n", sizeof(*a)); // sizeof(*a)==16---*a==*(a+0)==a[0]
// a是二維陣列得到陣列名,沒有&,也沒有單獨放在sizeof內部
// 所以a是二維陣列首元素的地址,就是第一行的地址
// *a就是第一行的大小
printf("%d\n", sizeof(a[3])); // sizeof(a[3])==16
// a[3] - 明確了型別就可以計算大小
return 0;
}
Part 2
Part 2.1 sizeof與strlen在字符陣列
//2.1字符陣列
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr)); // sizeof(arr)==6---陣列名arr,單獨放在sizeof內部,計算的是陣列總大小
printf("%d\n", sizeof(arr + 0)); // sizeof(arr + 0)==4/8---arr是陣列首元素的地址,地址就是4/8
printf("%d\n", sizeof(*arr)); // sizeof(*arr)==1---*arr是陣列首元素,計算的是首元素大小
printf("%d\n", sizeof(arr[1])); // sizeof(arr[1])==1---arr[1]陣列的第二個元素
printf("%d\n", sizeof(&arr)); // sizeof(&arr)==4/8---&arr雖然是陣列的地址,但是只要是地址就是4/8個位元組
printf("%d\n", sizeof(&arr + 1)); // sizeof(&arr + 1)==4/8---&arr+1跳過了整個陣列,指向了陣列之后,但還是地址
printf("%d\n", sizeof(&arr[0] + 1)); // sizeof(&arr[0] + 1)==4/8---&arr[0] + 1是第二個元素的地址
printf("%d\n", strlen(arr)); // strlen(arr)==隨機值---因為arr陣列中原本沒有'\0',就會在陣列arr后繼續找'\0'
printf("%d\n", strlen(arr+0)); // strlen(arr + 0)==隨機值
//printf("%d\n", strlen(*arr)); // error,應該傳遞地址進去,而不是傳字符進去
//printf("%d\n", strlen(arr[1])); // error,應該傳遞地址進去,而不是傳字符進去
printf("%d\n", strlen(&arr)); // strlen(&arr)==隨機值
printf("%d\n", strlen(&arr+1)); // strlen(&arr + 1)==隨機值
printf("%d\n", strlen(&arr[0]+1)); // strlen(&arr[0] + 1)==隨機值
Part 2.2 sizeof與strlen在字串
//2.2字串
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); // sizeof(arr)==7---計算的是arr陣列的總大小
printf("%d\n", sizeof(arr + 0)); // sizeof(arr + 0)==4/8---arr+0是陣列arr的首元素地址
printf("%d\n", sizeof(*arr)); // sizeof(*arr)==1---首元素大小
printf("%d\n", sizeof(arr[1])); // sizeof(arr[1])==1---arr第二個元素的大小
printf("%d\n", sizeof(&arr)); // sizeof(&arr)==4/8---&arr是陣列的地址
printf("%d\n", sizeof(&arr + 1)); // sizeof(&arr + 1)==4/8---&arr+1跳過了整個陣列,指向了陣列之后,但還是地址
printf("%d\n", sizeof(&arr[0] + 1)); // sizeof(&arr[0] + 1)==4/8---第二個元素地址
//傳給strlen()必須是地址,不是地址都是error
printf("%d\n", strlen(arr)); // strlen(arr)==6
printf("%d\n", strlen(arr + 0)); // strlen(arr + 0)==6
//printf("%d\n", strlen(*arr)); // error
//printf("%d\n", strlen(arr[1])); // error
printf("%d\n", strlen(&arr)); // strlen(&arr)==6
printf("%d\n", strlen(&arr + 1)); // strlen(&arr + 1)==隨機值
printf("%d\n", strlen(&arr[0] + 1)); // strlen(&arr[0] + 1)==5
//2.3字串
char* p = "abcdef";
printf("%d\n", sizeof(p)); // sizeof(p)==4/8---p就是個指標變數
printf("%d\n", sizeof(p + 1)); // sizeof(p + 1)==4/8---p + 1是的地址
printf("%d\n", sizeof(*p)); // sizeof(*p)==1---p是字符指標,*p訪問一個位元組
printf("%d\n", sizeof(p[0])); // sizeof(p[0])==sizeof(*p)==sizeof(*(p+0))==1
printf("%d\n", sizeof(&p)); // sizeof(&p)==4/8---&p是地址
printf("%d\n", sizeof(&p + 1)); // sizeof(&p + 1)==4/8---&p+1是指向p后邊空間的地址
printf("%d\n", sizeof(&p[0] + 1)); // sizeof(&p[0] + 1)==4/8---&p[0]+1就是第二個元素的地址
printf("%d\n", strlen(p)); // strlen(p)==6
printf("%d\n", strlen(p + 1)); // strlen(p + 1)==5
//printf("%d\n", strlen(*p)); // error
//printf("%d\n", strlen(p[0])); // error
printf("%d\n", strlen(&p)); // strlen(&p)==隨機值
printf("%d\n", strlen(&p + 1)); // strlen(&p + 1)==隨機值
printf("%d\n", strlen(&p[0] + 1)); // strlen(&p[0] + 1)==5
總結
- 陣列名單獨放在sizeof()內部,陣列名表示整個陣列,計算的是整個陣列的大小,單位是位元組
2.1 &陣列名,陣列名表示整個陣列,取出的是整個陣列的地址除上面2種情況之外,所有的陣列名都是陣列首元素的地址
2.2 sizeof運算子是計算運算元所占空間的大小,計算大小時,不在乎記憶體中放的值
2.3 strlen()庫函式—求【字串】長度只使用于:字串,字符陣列,求長度的時候,只關注’\0’
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258670.html
標籤:其他
上一篇:C語言陣列名作為函式引數
下一篇:學習閑談:玩王者之感悟人生
