c語言中陣列名a和 a詳細介紹

2021-09-23 03:28:49 字數 1535 閱讀 2124

其實這兩個東西挺難理解的,應該也沒有那麼重要,了解一下好了,主要還是要多多理解陣列指標的運算

最近又把學習c語言提上日程上來了~~~先把我打算看的書都寫下來吧,

先說說a和&a的區別(有三點,三個方向):

是a和&a的本質,都是什麼型別的。

從2維陣列的角度看。

從指標運算的角度看。

宣告:雖然陣列名不是指標,但是用的很像指標,我們暫且把它叫做乙個指標吧。

第乙個問題:

int a[10]; a ,&a和&a[0] 都是分別是什麼?先說明a ,&a和&a[0]三個值是的相等哈。

a叫做陣列名,是陣列首元素的位址,也就是&a[0]的值。像是乙個指標型別,是乙個int型的指標型別,int *,先理解成指標吧。

&a這才是乙個真正的指標,是乙個陣列指標。是陣列的位址。

切記:&a不是指向指標的指標,因為&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一樣,說明*&a僅僅是對這個陣列指標進行了取值,取得的是陣列的值,即陣列首元素的位址,而不是對&a這個位址進行了取值。這個應該是c語言中針對陣列指標運算的規定。

這裡的陣列指標&a取值之後,變成了a,是a,不是*a,變成了這個陣列的陣列名,或者說是陣列首元素的位址。

我做了如下實驗:

#include

int main 

; printf("a=%x\n",a); 

printf("&a=%x\n",&a); 

printf("*(int*)&a=%x\n",(*((int *)(&a)))); 

printf("*&a=%x\n",(*(*(&a)))); 

printf("&a[0]=%x\n",&a[0]); 

printf("*&a[0]=%x\n",*(&a[0])); 

return 0; 

} printf("*(int*)&a=%x\n",(*((int *)(&a)))); 

這句沒有像常規的一樣對&a進行取值,而是強制型別轉換了一下,可見這個不是乙個指向指標的指標。

第二個問題:

二維陣列中的利用指標來遍歷的方式,也不是乙個指向指標的指標(2級指標) ,這句printf("%d\n", *(*(a+i) + j)); *(a+i)也就是將陣列指標取值獲得陣列的首元素位址,常常的誤區就是陣列指標的取值運算和普通的指標取值運算不一樣。陣列指標取值運算類似乙個強制型別轉換的過程。

注意:二維陣列的陣列名a,是第乙個一維陣列的陣列指標,*a就是第乙個一維陣列的陣列名。也可以直接用tpye *強制型別轉換。

#include 

int main(int argc, char* ar**, char* env) 

, , }; 

int i = 0; 

int j = 0; 

for(i=0; i<3; i++)  } 

C語言中陣列名與 陣列名的區別

include int main void int ptr int a 1 a代表整個陣列的位址,1應該加上sizeof a 的長度,所以ptr指向a 5 位置處。printf d d n a 1 ptr 1 a代表陣列首元素的位址,1應該加上sizeof a 0 所以a 1指向a 1 處。retu...

c語言中陣列名和陣列名取位址理解

1 陣列名是個指標型常量,也就是值不能被改變。指標常量和常量指標區別見本文 char str hello char ch 6 hello ch str 錯誤,常量不能被賦值,正如 1 2,字面值常量1被賦值為2一樣錯誤。char ch 2 定義後,陣列名相當於char const ch 0x.ch就...

C語言中陣列名和陣列下標

整理自 c陷阱與缺陷 陣列注意點 1.c陣列中只有一維陣列,陣列的大小必須在編譯期作為常數確定。但c陣列的元素可以是任何型別的物件,當然也可以是另乙個陣列,所以 出乙個多維陣列。不太明白為什麼要強調只有一維陣列,難道 模擬 出來的多維陣列和真正的多維陣列不一樣?2.對於乙個陣列,我們只能夠做兩件事 ...