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