4.指針與數組
一些常見的錯誤觀點是數組和指針是完全可以互換的。盡管數組名字有時候可以當指針來使用,但是數組的名字不是指針。
數組是能用索引訪問的同質元素連續集合。(連續是指數組的元素在內存中是相鄰的,中間不存在空隙同質是指元素是同一類型)
指針在處理數組時很有用,既可以用指針指向已有的數組,也可以從堆上分配內存然後把這塊內存當做一個數組使用。
數組/指針表示法
給數組地址加1實際加了4,也就是整數的長度。
#include<iostream> using namespace std; int main() { int vector[5]={1,2,3,4,5}; int *pv=vector; int value=4; for(int i=0;i<5;i++) { *pv++ *=value; } pv=vector; for (int i=0;i<5;i++) cout<<*(pv+i)<<endl; }
指針和數組的區別
int vector[5]={1,2,3,4,5}; int *pv=vector;
vector[i]生成的代碼和*(vector+i)生成的不一樣,vector[i]表示法生成的機器碼從位置vector開始,移動i個位置,取出內容。而*(vector+i)表示法生成的機器碼則是從vector開始,在地址上增加i,然後取出這個地址中的內容。
sizeof操作符對數組和同一個數組的指針操作也是不同的。
sizeof(vector)=20; //數組分配的字節數
sizeof(pv)=4; //指針長度
如果從堆上分配內存並把地址賦給一個指針,那就肯定可以對指針使用數組下標並把這塊內存當成一個數組。
int *pv=(int*) malloc(5*sizeof(int)); for(int i=0;i<5;i++) { pv[i]=i+1; }
/////////////////////////////////////
for(int i=0;i<5;i++)
{
*(pv+i)=i+1;
}