這一篇文章揭秘指針和數組名的關系~~~
(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是一個指針變量,可以修改~~~~~
有關指針常量與常量指針的内容請參考下一篇文章~~~指針常量與常量指針