一、指針
1.可以在聲明語句中初始化指針。在這種情況下,被初始化的是指針,而不是它指向的值。也就是說,
int a = 4;
int* p = &a;
将p(而不是*p)的值設定為&a。
2.在c++中建立指針時,計算機将配置設定用來存儲指針的記憶體,但不會配置設定用來存儲指針所指向的資料的記憶體。所 以如下是不允許的:
int* b;
*b = 22;
注意:一定要在對指針應用解除應用操作符(*)之前,将指針初始化為一個确定的、适當的位址。這是關于使用指針的金科玉律。
3.不能簡單的将整數賦給指針,例如下面的是不允許的:
int* p;
p= 0xc0000000;
從概念上看,指針和整數是截然不同的類型。整數是可以執行加、減、乘、除等運算的數字,而指針描述的是位置,将兩個位址相乘沒有任何意義。要将數字值作為位址來使用,應通過強制類型轉換将數字轉換為适當的位址類型。
int* p;
p = (int*)0xc0000000;
注意:p是int值的位址,并不意味着p本身的類型是int。例如,在使用dos的ibm pc中的大型記憶體模式下,int類型是一個2個位元組的值,而位址是一個4個位元組的值。
二、指針和數組
首先聲明一點:指針和數組基本等價的原因在于指針算術和c++内部處理數組的方式,c++将數組名解釋為位址。
将指針變量和數組名加1後,其增加的值等于指向的類型占用的位元組數。例如:
int a[5] = {1,2,3,4,5};
int* p = a;
c++将數組名解釋為數組的第一個元素的首位址,即p = &a[0];
那麼*(p+1)和*(a+1)是等效的,*(p+2)和*(a+2)也是等效的,同樣用下标也是一樣的。
差別:①可以修改指針的值,但是數組名是常量,其不能作為左值。例如:
p = p+1;可以,而a = a+1;不可以。
②對數組應用sizeof操作符得到是數組的長度,而對指針應用sizeof得到的是指針的長度,即使指針指向的是一個數組。例如:
sizeof(a)= 20;而sizeof(p)=4。
三、函數、數組和指針
注意:在函數原型或函數定義頭檔案的場合中(并且也隻有這兩種場合中),可以用int* a代替函數參量int a[ ]。是以下面的4種原型都是等價的:
int test(int *a,int n);
int test(int a[ ],int n);
int test(int *,int );
int test(int [ ],int );
原型允許省略名稱,但是定義函數時,名稱是不可以省略的。
無論在任何情況下,形式int *a都表示a是指向int的指針,形式int a[ ]也可以表示a是指向int 的指針,但隻是在聲明形式參量的時候才可以這樣使用。使用第二種形式可以提醒使用者a不僅指向一個int數值,而且它指向的這個int是一個數值中的元素。