指針筆記

指針優點:
1。爲函數提供修改調用變元的手段;
2。支持C++動態分配子程序
3。可以改善某些子程序的效率
4。爲動態數據結構(如二叉樹、鏈表)提供支持
注:指針爲程序引入了一層間接性,可以操控指針而不直接操控對象。
1。可操控指針內含的地址也可操控指針所指的對象
2。指針可能並不指向任何對象,寫*pi時,可能會使程序在執行期錯誤,如尋址到某個
對象,則提領操作,不指向任何對象,會出錯,所以在提領前先確定它的確指向某對象.

一個未指向任何對象的指針,內含地址爲0,有時稱爲null指針,assert (p != 0)可檢測
是否分配成功。也可用if (pi),只有在pi含非零值時,才爲true.
一、定義:
爲存放內存地址的變量。
詮釋:
指針爲一數據類型也有自己的地址。佔用四個字節的存儲空間
int * p: &p返回的是指針p的地址,而不是所指變量的地址
地址:一般指內存中另一變量的位置
二、指針變量:
type * name 聲明時必須確保它的類型與要指向的對象類型兼容
const 是“最靠近”爲原則
指向整數常量的指針:const int * p;它所指向的值只讀不能被修改 *p = 4(錯誤),p
= 5(正確)
指向一個整數的常量指針:int * const p;不允許修改指針變量的值,*p = 5 (正確),
p = 5 (錯誤)
三、指針操作符:
&(取址運算符):一元操作符,只作用於一個操作數,返回操作數的地址
*(提領操作):一元操作符,是&的補操作,返回其操作數所指變量的值
四、指針賦值及轉換:
同類型直接賦值,異類型要進行轉換。
強制轉換:可以把表達式結果硬性轉換爲指定類型
char * p;(int *)p 把p強制轉換爲int型,記住轉換過程中要注意兩個類型的大小,大
轉小時可能會有數據丟失(如int到double)
涉及void *的:
c 中void *類型可賦值給任何類型的指針,反之亦然
c++ 中都需要強制轉換
void * 可似爲無窮大能接納任何類型賦值,反之不行int * p =9;void * t= p(正確
);p=t(錯誤)
不涉及void *的都要強制轉換
五、指針的算術操作
和整數的加法,減法,自身的增量、減量
指針增量後指向下一個與指針基類同型的元素,增減單位是所指類型的長度。
六、其他說明:
1。指針和數組:
不帶下標的數組名返回數組的起始地址,即數組首元素的地址,所以對數組的訪問可有
兩種方式:數組下標和指針算術
2。函數指針:
函數具有可賦給指針的物理內存地址,一個函數地址也爲該函數的進入點,也是調用函
數的地址
3。多級指針地址 **p
七、動態內存分配
定義:是程序在運行中取得內存的方法。是從堆(heap)--系統的自由內存區-取得內

運算符:
new(c中的malloc):自動建立一個具有合適大小的對象,返回具有正確類型的指針,如分
配不成功,返回一個空指針0,且可自動調用構造函數。
char * p = new char('t');
delete(c中的free):delect p;
釋放數組對象時要使用方括號delete [] p;
八、與引用的區別
&引用運算符:
1。引用只是變量的別名,而不是指向變量的指針(區別於取址運算符"&")不佔內存空間
,對變量引用的改變其相應的變量也會改變。
2。不能對引用使用指針間接運算符“*”進行復引用操作
3。引用必須在聲明時初始化 int &c = count;(c是count的別名)
九、注意:
在每次使用指針前,都應該初始化。以防止指針指向空對象。
應用舉例(pointer.cpp)
編譯環境:Window2000 Vc6.0
#include
#include
using namespace std;
void main()
{
//int * p =1, 不對,整型常量不能轉換爲整型指針,char * t =0 可以
//指針運算符&返回操作數的地址,此處&p,&q是p,q的地址
//要返回得到指向的地址要麼正接用p,q 要麼用&(*p),&(*q),指針也是
//是一種數據類型也有自己的內存地址爲4個字節,8位
int * q , * p;
int x =1 ,y = 2;
q = &x;
p = &y;
cout << "p" << &p << " "<< &(*p)
<< " " << p <<" " << *p << endl;
cout << "q" << &q << " " << &(*q)
<< " "<< q<<" "<< *q<< endl;
//指針賦值,整個指針包含的地址、指向的對象都改變了
int * t;
t = q;
q = p;
p = t;
cout << "p" << p << " "<< *p << endl;
cout << "q" << q << " " << *q << endl;
//指針所指對象的賦值操作,地址不變
q = &x; //1
p = &y; //2
cout << "p" << p << " "<< *p << endl;
cout << "q" << q << " " << *q << endl;
//強制類型轉換
//double *l;
//l = (double*)*q; // q的值賦給臨時變量 *t=1
*t = *q; // q的值賦給臨時變量 *t=1
cout << *t <<endl;
*q = *p; // q的值給q,*q=2
cout << *q <<endl;
//??*p = *t; //爲什麼此處*p值沒有改變
*p = *t;
cout << *t <<endl;
cout << "p" << p << " "<< *p << endl;
cout << "q" << q << " " << *q << endl;
//引用的使用
int count = 1;
int &c = count; //聲明c爲count的引用,c只是count的別名,不佔實際內存空間
cout << "引用";
cout << c << count << endl;
//引用變量在聲明時要初始化
//int &t; (錯誤)
//t = count ;
//不能用指針間接運算符復引用一引用,引用只是一變量的別名
//它不佔地址空間
//cout << *c << endl;
int iF = 10;
const int * ciS = 0; //指向整數常量的指針,指針最好都進行初始化
int * iT = &iF;
//*ciS = 100;(錯誤),*ciS爲常量
ciS = iT;
cout << ciS << " "<< *ciS <<endl;
int * const icS = &iF; //指向整數的常量指針
*icS = 10;
icS = iT;
cout << icS << " " << *icS << endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章