目錄
- 一、sizeof
- 1.1一維陣列與sizeof
- 例一:(詳解)
- Summary:
- 1.2字符陣列與sizeof
- 例二:(練習)
- 例三:(練習)
- 1.3字符指標與sizeof
- 例四:(練習)
- 1.4二維陣列與sizeof
- 例五:(提高)
- 二、strlen
- 2.1字符陣列與strlen
- 例六:(詳解)
- 例七:(練習)
- 2.2字符指標與strlen
- 例八:(練習)
一、sizeof
sizeof:運算子
作用:
- 求變數所占空間的大小
- 求型別創建的變數所占空間的大小
1.1一維陣列與sizeof
例一:(詳解)
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a[1]));//第二個元素
printf("%d\n", sizeof(&a[0]));//第一個元素的地址(4/8)
printf("%d\n", sizeof(&a[0] + 1));//第二個元素的地址(4/8)
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a + 0));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a + 1));
- a表示首元素地址,*a就是首元素

- sizeof(陣列名),表示整個陣列的大小

- sizeof(陣列名+數字),陣列名此時表示首元素的地址
X86下
X64下
- &a整個陣列的地址

- *(&a)對整個陣列取地址后解參考后再次得到陣列,等價于a

- &a+1雖然跳過了整個陣列但是本質仍然是地址

Summary:
陣列名表示整個陣列的情況:
- sizeof(陣列名)
- &陣列名
| ( )內容 | sizeof()計算結果 |
|---|---|
| 只有陣列名 | 整個陣列的空間大小 |
| 陣列名+數字 | 地址:4/8 |
| &陣列名(+數字) | 地址:4/8 |
| *陣列名,陣列名[0] | 第一個元素的位元組大小 |
1.2字符陣列與sizeof
例二:(練習)
由例一得出的summary可以輕松解決下面這個問題,就不再贅述,
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//整個陣列 6
printf("%d\n", sizeof(arr + 0));//第一個元素的地址 4/8
printf("%d\n", sizeof(*arr));//第一個元素 1
printf("%d\n", sizeof(arr[1]));//第二個元素 1
printf("%d\n", sizeof(&arr));//整個陣列的地址 4/8
printf("%d\n", sizeof(&arr + 1));//跳出整個陣列,但還是一個地址 4/8
printf("%d\n", sizeof(&arr[0] + 1));//第二個元素的地址 4/8
例三:(練習)
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//整個陣列 7
printf("%d\n", sizeof(arr + 0));//首元素的地址 4/8
printf("%d\n", sizeof(*arr));//首元素 1
printf("%d\n", sizeof(arr[1]));//第二個元素 1
printf("%d\n", sizeof(&arr));//整個陣列的地址 4/8
printf("%d\n", sizeof(&arr + 1));//跳出整個陣列(包括\0),但還是一個地址 4/8
printf("%d\n", sizeof(&arr[0] + 1));//第二個元素的地址 4/8
Tip:
- char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ };與char arr[] = “abcdef”;的區別
1.3字符指標與sizeof
字符指標相關知識請戳👉深度剖析指標👈
例四:(練習)
char* p = "abcdef";
printf("%d\n", sizeof(p));//p為指標變數,存放著a的地址 4/8
printf("%d\n", sizeof(p + 1));//p+1是字符b的地址 4/8
printf("%d\n", sizeof(*p));//解參考找到a的值 1
printf("%d\n", sizeof(p[0]));//相等于*(p+0)得到a 1
printf("%d\n", sizeof(&p));//(1) 指標p的地址 4/8
printf("%d\n", sizeof(&p + 1));//(2) 跳過一個指標p的地址 4/8
printf("%d\n", sizeof(&p[0] + 1));//第二個元素b的地址 4/8
- (1)取指標p的地址

- (2)跳過一個指標p的地址

1.4二維陣列與sizeof
例五:(提高)
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//整個陣列 12*4=48
printf("%d\n", sizeof(a[0][0]));//第1行第1列的元素 4
printf("%d\n", sizeof(a[0]));//第1行陣列的陣列名 4*4=16 (只有陣列名的情況)
printf("%d\n", sizeof(a[0] + 1));//陣列名+數字表示a[0][1]的地址 4/8
printf("%d\n", sizeof(*(a[0] + 1)));//表示a[0][1] 4
printf("%d\n", sizeof(a + 1));//二維陣列的首元素的地址是第一行,a+1第2行的地址 4/8
printf("%d\n", sizeof(*(a + 1)));//第2行的地址解參考 4*4=16
printf("%d\n", sizeof(&a[0] + 1));//取到第1行的地址,+1得到第2行的地址 4/8
printf("%d\n", sizeof(*(&a[0] + 1)));//第2行地址解參考得到第2行陣列 16
printf("%d\n", sizeof(*a));//整個陣列解參考得到首元素 16
printf("%d\n", sizeof(a[3]));//第4行(假象的一行并沒有訪問)陣列的陣列名 16

二、strlen
strlen:庫函式
作用:求字串的長度
2.1字符陣列與strlen
例六:(詳解)
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));//(1)
printf("%d\n", strlen(arr + 0));//(2)
printf("%d\n", strlen(*arr));//(3)
printf("%d\n", strlen(arr[1]));//(4)
printf("%d\n", strlen(&arr));//(5)
printf("%d\n", strlen(&arr + 1));//(6)
printf("%d\n", strlen(&arr[0] + 1));//(7)
- (1)(2)遇到
\0才會停下


-
(3)(4)*arr取出首元素,將首元素a的ASCII碼值97傳給strlen()


-
(5)(6)&arr的型別為char ( * )[6]但是strlen()接收的是char * 型別,雖然型別不匹配,但是strlen將&arr轉換成char*型別,所以strlen()接收了首元素的地址


- (7)&arr[0]首元素地址,&arr[0]+1第二個元素地址

例七:(練習)
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//遇到\0就停止 6
printf("%d\n", strlen(arr + 0));//6
printf("%d\n", strlen(*arr));//ASCII碼值給strlen 隨機值
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
2.2字符指標與strlen
例八:(練習)
char* p = "abcdef";
printf("%d\n", strlen(p));//p存放著a的地址 6
printf("%d\n", strlen(p + 1));//p+1是b的地址 5
printf("%d\n", strlen(*p));//*p是aASCII碼值給strlen 隨機值
printf("%d\n", strlen(p[0]));//同上
printf("%d\n", strlen(&p));//在指標變數p中找\0 隨機值
printf("%d\n", strlen(&p + 1));//跳過整個p的地址 隨機值
printf("%d\n", strlen(&p[0] + 1));//第二個元素b的地址 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299981.html
標籤:其他
下一篇:資料結構(4)原來這個叫樹

