歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++指針與數組的聯系和區別

C++指針與數組的聯系和區別

日期:2017/3/1 9:44:41   编辑:Linux編程

一、指針

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

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm

C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm

Copyright © Linux教程網 All Rights Reserved