c 指標(三) 指標和陣列名的關係

2021-08-19 18:38:06 字數 1853 閱讀 4459

這一篇文章揭秘指標和陣列名的關係~~~

(1)、陣列的定義

int array[10];//定義了乙個陣列array,並且初始化都為0,陣列為

int array[10]=;//定義了乙個陣列array,並且初始化都為0,但是第一,第二個元素又被改寫為1和2,最後陣列為

int array;//該定義錯誤,沒有指定需要多少的記憶體空間,系統無法分配空間
定義乙個陣列時的記憶體分配是不是也和定義乙個int型資料或者定義乙個char型字元時的記憶體分配一樣呢?

大體是一樣的,當定義乙個陣列時,系統為這個陣列分配 n*sizeof(int) 個位元組的記憶體空間(n為陣列的長度),並且我們給這個陣列起了乙個名字array,但是當我們執行下邊的語句

cout《輸出的並不是整個陣列,而是乙個十六進製制的數。這說明array並不代表這個陣列整個記憶體空間,array是乙個位址

當我們取這個位址中的內容時,發現 *array 是陣列中的第乙個數字

cout<<*array《所以array有兩層含義:

1、這個陣列的名字

2、乙個位址,這個位址就是系統分配給這個陣列的記憶體空間的首位址(也就是陣列中第乙個數字的位址),那麼 *array 就代表陣列中的第乙個數,如果陣列定義為int array[10]=, 那麼 *array 就等於1

為什麼會這樣呢?為什麼定義int變數 a 後,a就代表內容,定義陣列 array 後,array 就代表位址了呢?

可以這麼理解,定義 int 變數的時候,變數代表的只是乙個資料單位(乙個數啦,乙個字元啦),我們通過使用 a 就可以得到具體的資料,從而加加減減,很方便吧~;相反,如果我們把 a 也定義為像陣列一樣是個位址,那麼每次我們取這個數字都要 *a 才能取到數字,好麻煩有沒有~~~~~

但是定義陣列的時候,裡邊有好多數啊,如果我們使用 array 就得到了一串的所有的數字,而我們想要用其中的第乙個數字,第二個數字等等就沒辦法得到了,怎麼加加減減,我們想要得到的是乙個數呀;再者,如果 array 代表陣列的首位址,*array就得到了第乙個數字,然後通過首位址 array 計算第二個數字,第三個數字,第四個數字等等的位址(array+1, array+2, array+3 等等),然後 *(array+i) 就得到陣列中所有的數字啦,很方便有沒有~~~,要是 array 代表的是第乙個數字的內容,取第二個數字的時候要對 array 先進行取位址 &array,再進行位址運算 (&array+i),再根據位址取數字 (*(&array+i)) ,很麻煩有沒有 ~~~~~

(2)、陣列名和指標遍歷陣列

最直接訪問陣列元素的方法

int array[10]=;

for(int i=0;i<10;i++){

cout《我們也可以這樣

for(int i=0;i<10;i++){

cout<<*(array+i)《也可以這樣

int *p;

p=array;

for(int i=0;i<10;i++){

cout《還可以這樣

int *p;

p=array;

for(int i=0;i<10;i++){

cout<<*(p+i)《但是指標和陣列名在任何情況下都相同嗎?

請看下面兩段**

int *p;

p=array;

for(int i=0;i<10;i++){

cout<<*p《上邊這段**得到了正確的結果

然而下邊這段**就會出錯

for(int i=0;i<10;i++){

cout<<*array《為什麼呢,因為 array 是乙個指標常量,它的值是不能修改的,array一直指向系統為陣列分配的記憶體空間的首位址;而p是乙個指標變數,可以修改~~~~~

指標和陣列名

想要清楚的知道指標和陣列的本質區別還有處理方式,感覺繞不開看編譯器是如何處理的了,有時間可以上知乎搜搜有什麼編譯類的書籍,或者找個懂編譯的大神,在網上看到有一篇從編譯器角度剖析陣列名的,有所幫助,雖然沒有說到足夠深入讓我理解指標和陣列真正的本質是什麼 本文只是稍微說明一下自己的猜測和理解,可能存在有...

指標和陣列名

在學習c語言指標時候,老師告訴我們,陣列名就是指標,指向陣列首元素的位址。有如下 int main int argc,const char argv printf arr p n arr printf arr 1 p n arr 1 printf lu n sizeof arr printf n p...

陣列名和陣列名取位址 指標陣列和陣列指標的區別

一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。分析 由執行結果可知,陣列名a和 a的記憶體位址相同,我們已經知道a a 0 所以有a 1指向陣列中下乙個元素 即為在首位址2751180基礎上加int的位元組數4...