1. 程式人生 > >c++指標(三)——指標和陣列名的關係

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

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

(1)、陣列的定義

int array[10];//定義了一個數組array,並且初始化都為0,陣列為{0,0,0,0,0}
int array[10]={1,2};//定義了一個數組array,並且初始化都為0,但是第一,第二個元素又被改寫為1和2,最後陣列為{1,2,0,0,0}
int array[];//該定義錯誤,沒有指定需要多少的記憶體空間,系統無法分配空間

定義一個數組時的記憶體分配是不是也和定義一個int型資料或者定義一個char型字元時的記憶體分配一樣呢?

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

cout<<array<<endl;

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

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

cout<<*array<<endl;//輸出陣列中的第一個數字

所以array有兩層含義:

1、這個陣列的名字

2、一個地址,這個地址就是系統分配給這個陣列的記憶體空間的首地址(也就是陣列中第一個數字的地址),那麼 *array 就代表陣列中的第一個數,如果陣列定義為int array[10]={1,2,3,4,5,6,7,8,9,0}, 那麼 *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]={1,2,3,4,5,6,7,8,9,0};
for(int i=0;i<10;i++){
    cout<<array[i]<<endl;
}

我們也可以這樣

for(int i=0;i<10;i++){
    cout<<*(array+i)<<endl;
}

也可以這樣

int *p;
p=array;
for(int i=0;i<10;i++){
    cout<<p[i]<<endl;
}

還可以這樣

int *p;
p=array;
for(int i=0;i<10;i++){
    cout<<*(p+i)<<endl;
}

但是指標和陣列名在任何情況下都相同嗎?

請看下面兩段程式碼

int *p;
p=array;
for(int i=0;i<10;i++){
    cout<<*p<<endl;
    p++;
}

上邊這段程式碼得到了正確的結果

然而下邊這段程式碼就會出錯

for(int i=0;i<10;i++){
    cout<<*array<<endl;
    array++;
}

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

有關指標常量與常量指標的內容請參考下一篇文章~~~指標常量與常量指標