數組與指針
指針也是一種變量,代表着指向一個地址
指針變量里面存的值是一個數字,數字是幾就代表指向內存的哪里
指針的賦值
一般情況下指針會用一個有意義的地址來賦值(&代表取地址)
int a[10];
int v;
int *pa=a;
int *pv=&v;
上面的數組a可以賦值給pa是因為數組名字就代表了數組的首地址
解引用
解引用就是代表獲得這個地址指向那塊內存的值,這個值如何解釋由這個指針的類型決定
舉個例子:
int ans=4;
int *pans=&ans;
*pans=5;
printf("%d\n",ans);
由於pans指向的是ans的地址,我們對*pans賦值操作,ans也會被改變
再來一個例子:
我們知道一個 int 的占用空間是32bit 一個char占用空間的大小8bit
char a[4]={1,2,3,4};
int *p=a;
printf("*p:0x%x\n",*p);
%x代表16進制輸出的,可以看到我們定義的char數組按照 int類型解釋了
我們對*p操作也將會影響到char數組
還有一種解引用就是結構體指針可以使用->
操作
簡單的應用
函數傳參:
我們在函數傳參數的時候,如果我們想在函數體內改變一個外部變量,通常情況下需要傳遞這個指針
在傳遞數組的時候,我們通常是傳遞這個數組的首地址,而不是這個數組的拷貝
我們在遍歷數組的時候可以使用指針,更高效的操作
int a[10];
int *pa=a;
int *ped=pa+10;
while(pa<=ped)
{
//do something
pa++;
}
還有一點需要注意的就是,指針做加減運算的時候每次偏移量是sizeof(type)
數組和指針的區別
數組名字代表首地址,我們在使用數組的元素的時候a[i],相當於*(a+i)
我們在使用數組的時候甚至可以這樣:
int a[10];
4[a]=5;//等效a[4]=5;
不過最好不要這樣做,容易引起別人的困惑
但是數組名是不可以被賦值,不能使用自增自減操作
我們對數組進行sizeof操作時候,得到的是數組的實際大小,對指針操作時,只能得到指針長度大小
int a[10];
sizeof(a);
int *pa=a;
sizeof(pa);