C语言-数组名真的不是指针
文章目錄
- 1 前言
- 2 關于一維數組
- 3 sizeof運算符和自增運算符
- 4 數組名也不是常量指針
- 5 總結
1 前言
參照我之前的兩篇文章:
二維數組做函數的參數
動態創建二維數組
事實告訴我們,二維數組名不等于二級指針
2 關于一維數組
對于一維數組,用一級指針指向數組名,用一級指針做參數傳遞一維數組,似乎毫無問題。
void f(int *p); int main(void) {int arr[2];int *p = arr;f(arr);return 0; }3 sizeof運算符和自增運算符
1、sizeof 指針是指針的大小,sizeof 數組名是整個數組的大小
int *p; int arr[4]; printf("sizeof(p) = %d \n", sizeof(p)); printf("sizeof(arr) = %d ", sizeof(arr));Output: sizeof(p) = 8 sizeof(arr) = 162、指針可以遞增操作,而數組名不可以
int arr[4] = {1, 2, 3, 4}; int *p = arr; printf("*(++p) = %d", *(++p)); // Output:*(++p) = 2 printf("*(++arr) = %d", *(++arr)); // errorOutput error: error: lvalue required as increment operand這里出現了兩個問題:
4 數組名也不是常量指針
1、常量指針可以作為左值,而數組名不可以:
int i = 1; int arr[2]; int *const p = &i; // OK arr = &i; // error事實上,查閱資料可以發現:
兩者并不是同一種數據類型,關于這一點:
我個人認為在C語言中,數組也是一種數據類型,一種特殊的數據類型
我們知道,在向函數傳遞二維數組的時候,我們使用了數組指針,即int (*p)[n]
而數組指針,我們可以理解為C語言為數組創造的一種特殊的指針類型。
2、觀察下面例子,詳細內容可以參見 這里
printf("%#x \n", a); printf("%#x \n", &a); printf("%#x \n", &a[0]); printf("%#x \n", &a[0][0]);Output: 0x9ffe40 0x9ffe40 0x9ffe40 0x9ffe40我們可以發現,對于數組名,處于不同類型下,取得的值(地址)都是一樣的
這個例子的意思是,數組名和指針存在著隱式轉換。
這也是很多人把數組名當作指針的原因,因為數組名在大多數的情況下都會隱式轉換為指針,由于數組名只能作為右值,所以指針也是一個右值的指針。
既然大多數情況下會隱式轉換為指針,那么下面就是少數情況(不會轉換為指針):
5 總結
在C語言中,數組名確實和指針有著微妙的關系
但是數組名并不是指針,由于它大部分情況下都表現為一個指針
所以很多地方都認為它是指針,事實上并不是,它只是很像指針而已
我個人認為數組是C語言中一種特殊的數據類型,有著特定類型的指針。
總結
以上是生活随笔為你收集整理的C语言-数组名真的不是指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言-动态创建二维数组
- 下一篇: 栈 - 关于出栈序列,判断合法的出栈序列