C 指標型別

2021-07-30 11:55:52 字數 3005 閱讀 1477

1. 定義

《型別》* 《指標變數》;

型別決定了指向的記憶體空間的大小。

指標變數也是一種變數,有著自己的記憶體空間,該空間上儲存的是另乙個變數的記憶體空間。

可以使用typedef取別名來減少定義變數時的一些麻煩,如typedef int* pointer;

2. 操作

1)取位址

int* p; int x; p = &x;//p指向x的位址,p的型別是int*, &x的型別也是int*

2)間接訪問

對於一般的指標變數,訪問格式是:*《指標變數》

結構型別的指標變數,訪問格式是:(*《指標變數》).《結構成員》  或 《指標變數》->《結構成員》

3)賦值

任何型別的指標都能賦給void *型別的指標變數,而非void * 型別的指標變數只能接受同型別的賦值。

4)指標運算

乙個指標加上或減去乙個整型值:《資料型別》* 《指標變數》; int a; 《指標變數》+a;可以理解為陣列中下標的變化,

《指標變數》 = 《指標變數》+(a*sizeof(《資料型別》))

兩個同型別的指標相減:結果是整型值,對應的是儲存空間中元素的個數,可用於求陣列的大小。

5)指標的輸出

非char *型別的指標變數:cout3. 指向常量的指標變數

const 《型別》 *《指標變數》;

4. 指標與動態變數

動態變數是在程式執行時才產生,並在程式結束前消亡。動態變數跟區域性變數不同,在程式執行前編譯程式就知道了區域性變數的存在

建立:new 《型別名》;如:int *p; p=new int; *p=1;

new 《型別名》[《整型表示式1>]...[《整型表示式n>];如:int (*q)[20]; int n=5;q=new int[n][20];

void *malloc(unsigned int size);如:double *q; int n=2; q=(double *)malloc(sizeof(double)*n);

撤銷:因為動態變數不能自動消亡,需要顯示撤銷其記憶體空間。

delete 《指標變數》;如:int *p=new int; delete p;

delete 《指標變數》;如:int *p=new int[20]; delete p;

void free(void *p);如:int *p=(int *)malloc(sizeof(int)*6)

應用:動態陣列、鍊錶

5. 指標 vs 無符號整數

指標從形式上看屬於無符號數,但是指標可以關聯到程式實體(變數或函式),指標指向某個記憶體位址,無符號整數的某些運算不能實施在指標上(如乘法和除法就不能)。

6. new vs malloc

1)new 自動計算所需分配的空間大小,而malloc需要顯示指出。

2)new自動返回相應型別的指標,而malloc要做強制型別轉換。

3)new會呼叫相應物件類的建構函式,而malloc不會。

對於new 和 malloc,如果程式的堆區沒有足夠的空間可供分配,則產生bad_alloc異常(會返回空指標null)。

7. delete vs free

1)delete會呼叫析構函式,free不會。

2)delete或free乙個指標時,其實只是從編譯器釋放了這個位址的記憶體,但指標仍然指向該位址,此時的指標叫做懸浮指標,懸浮指標不為空指標,依據可以用來賦值或者和使用,所以會產生語義錯誤。(怎麼解決呢?在delete或free後將指標設定為null)。

3)如果沒有進行delete或free操作,就將指標指向別處,之前分配的記憶體空間就會一直存在但不能再被使用,也就是說造成了記憶體洩漏

8. 函式指標

函式指標就是指向函式的指標。

定義格式:《返回型別》 (*《指標變數》)(《形式參數列》); 如:double (*fp)(int); double fun(int x); fp=&fun;

或 typedef 《返回型別》 (*《函式指標型別名》)(《形式參數列》);  《函式指標型別名》 《指標變數》; 如:typedef double (*fp)(int); fp fp;

使用:(*《指標變數》)(《形式參數列》); 如 (*fp)(10); 相當於 fun(10);

為什麼使用函式指標:可以實現多型,乙個函式指標指向不同的函式就可以實現不同的功能,可以結合設計模式理解。

可以向函式傳遞函式,如:int func(int (*fp)(int)){};

9. 指標與陣列

10. 多級指標

指標除了可以指向一般型別的變數外,還可以指向指標型別的變數。指標變數要初始化後才能使用。

如果乙個指標變數沒有初始化或者賦值,訪問它所指向的變數將會導致執行時刻的嚴重錯誤。

int x;

int *p;

int **q;

*p=1; //error, p未初始化,p指向的空間不知道是什麼

*q=&x; //error,q未初始化

q=&p; //ok

**q=2; //error, q指向的變數p未初始化

11. 指向常量的指標型別 vs 指標型別的常量

指向常量的指標型別:不能改變指向的內容。如:const int *p;

兩者結合:const int*const r;

詳談C 指標型別

操作c 中的指標,是一種編寫非託管中的一種技術。c 中指標型別可能是 儲存在棧 中的值型別,也可能是 儲存在堆 中的引用 型別。不過無論是什麼型別,基本格式都有乙個共同的要求就是必須都是支援非 託管的型別或者空型別。這裡順便提一句,非託管的型別編譯依賴系統型別庫,而託管的型別依賴clr中元 資料.在...

C語言指標型別

在c語言中,定義了乙個特殊的資料型別 指標型別。指標型別的變數是專門 用來儲存某個變數的記憶體位址。這樣,我們就可以從指標變數的值取得執行時確切的位址了。eg int a 4個位元組 2000 2001 2002 2003 int b 4個位元組 2004 2005 2006 2007 int a ...

c 指標型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...