C 基礎總結 4 指標

2021-07-10 06:17:43 字數 3211 閱讀 5823

指標是乙個變數,其儲存的值是位址,而不是值本身。(有點類似於組成原理裡面的變址定址)

在討論指標之前,我們先來看看如何尋找常規變數的位址。只需對變數引用取位址符(&)就行了。

如下面一段**:

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 和指標 指標是另外一種型別的復合型別,復合型別是指基於其它型別定義的型別 意思是說指標是指向什麼型別,那麼指標本身就是什麼型別 指標其實就是程式資料在記憶體中的位址,而指標變數是用來儲存這些位址的變數 記憶體是乙個很大的,線性的位元組陣列。每乙個位元組都...