天天看點

指針與數組的聯系和差別

一、指針

      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是一個數值中的元素。

繼續閱讀