指標是乙個變數,其儲存的值是位址,而不是值本身。(有點類似於組成原理裡面的變址定址)
在討論指標之前,我們先來看看如何尋找常規變數的位址。只需對變數引用取位址符(&)就行了。
如下面一段**:
duck變數為int型變數,其分配的位址是1000,裡面儲存的值是12,而birding是乙個int型指標變數它本身的位址是1006,而在它裡面儲存的值duck的位址1000。
所謂指標指的是儲存的其他變數的位址。
指標的宣告和初始化
int *ptr;//宣告乙個int型指標
*兩邊的空格是可選的。
傳統上,c程式設計師使用這種格式。
int *ptr;//強調*ptr是乙個int型別
c++程式設計師通常使用下面這種方式
int* ptr;
強調int*之一中指向int型別的指標。在**新增空格對於編譯器沒有區別。
注意:
int *p1, p2;表示的是建立乙個int型別指標p1和乙個變數p2。如果要宣告兩個變數,應該這樣做:int *p1, *p2。
指標的初始化
#include using namespace std;
int main()
{ int a=3;
int *b;
b=&a;
cout<
cout<
從執行結果可以證明上面的圖的正確性。
注意:c++在建立指標的時候,計算機將會分配用來儲存位址的記憶體,但不會分配用來儲存指標所指向的資料的記憶體。
如下所示:
int *a;
*a=2333;
上面這段**並沒有為2333分配記憶體,而是將其隨機存放在乙個位置,有可能是空閒位置,有可能是乙個已經存放了資料的位置從而造成資料損壞。
使用new申請記憶體
int * pn=new int;
new int 告訴電腦程式要申請一塊int型別的記憶體,new運算子根據型別判斷需要多少位元組的記憶體。找到記憶體之後將位址傳回pn。
還可以使用變數直接賦值。
int higgens;
int * pt=&higgens;
申請陣列
以申請int型別的陣列為例:
int * psome=new int[20];//執行這句的時候,計算機會申請10個int型的連續儲存記憶體,並將首位址返回。
#include using namespace std;
int main()
{ int nights = 1001;
int * pt = new int; //c-style
*pt = 1001;
cout << nights << ",location " << &nights << endl;
cout << "int value " << (*pt) << "location " << pt << endl;
double * pd=new double;
*pd = 10001;
cout << "value = " << *pd << " location " << pd << endl; //show the location of pd;
cout << "location of pointer pd " << &pd << endl;
cout << "size of pt " << sizeof(pt) << endl;//顯示申請的位址的大小
cout << "sizeof *pt " << sizeof(*pt) << endl;//顯示儲存的位址裡面的值的大小
cout << "size of pd " << sizeof(pd) << endl;
cout << "size of *pd " << sizeof(*pd) << endl;
/*不初始化的話pp裡面存的就是未知位址,可能會造成資料損壞、
*/double *pp;
cout<
一半常規變數申請的記憶體是在棧中的,隨著函式的生命週期的結束會自動被**。但是new申請的內存在堆(heap)或自由儲存區中,用完之後必須被**。不然會造成記憶體的洩露。所以這裡我們需要使用delete來**new申請的記憶體。
delete的用法
int *ps=new int;
delete ps;
int jugs=5;
int *pi=&jugs;
delete pi;//wrong
delete只能用來**new申請的動態記憶體,所以第二種用法無效。
刪除陣列的用法和上面的類似
int *a=new int[10];
delete a;
使用new和delete的規則
1.delete只能用來釋放new分配的記憶體
2.不要使用delete對同乙個記憶體釋放兩次
3.new和delete應該成對出現。
4.對空指標使用delete是安全的。
delete刪除的是new申請的記憶體裡面的值,而不是指標本身。
#includeusing namespace std;
int main()
{ int a=3;
int *b=&a;
int *c=new int();
int *d=c;
*c=123;
cout<
從上面的例子可以看出指標c和d是兩個不同的指標,但是他們指向的同一塊記憶體。delete刪除的只是申請的記憶體裡面的值,而對指標本身的位址以及指標儲存的位址並沒有影響。系統會為a,b,c,d都分配乙個位址,但是b儲存的是a的位址,c,d儲存的是123在堆裡面的位址。delete也就是將123莫抹去,是該塊記憶體顯示為未用。
C語言總結4 指標上
指標的定義 type 資料型別 不知道指標指向 時可以置為null,沒有指向固定位置的指標為野指標 指標的大小在32位平台下是4位元組,在64位平台下是8位元組 includeint main 對指標加減1是加減上其所指向型別的大小 指標指向的都是首位址,所以加減一是加減型別所佔位元組數 指標的型別...
C語言總結 4 指標和陣列
指標就是指標,指標變數在 32 位系統下,永遠佔 4 個 byte,其值為某乙個記憶體的位址。指標可以指向任何地方,但是不是任何地方你都能通過這個指標變數訪問到。陣列就是陣列,其大小與元素的型別和個數有關。定義陣列時必須指定其元素的型別和個數。陣列可以存任何型別的資料,但不能存函式。c 中的引用 1...
C 基礎(1) 指標
三.指標使用 四.函式和指標 五.const 和指標 指標是另外一種型別的復合型別,復合型別是指基於其它型別定義的型別 意思是說指標是指向什麼型別,那麼指標本身就是什麼型別 指標其實就是程式資料在記憶體中的位址,而指標變數是用來儲存這些位址的變數 記憶體是乙個很大的,線性的位元組陣列。每乙個位元組都...