C 面試 (1) 指標

2021-09-08 22:21:48 字數 1604 閱讀 5820

指標是c++中一類頗具特色的資料型別,允許直接操作記憶體位址,實現記憶體的動態分配。指標問題通常包括指標常量,常量指標,陣列指標,指標陣列,函式指標,指標傳值等。

指標和引用的區別

非空區別。在任何情況下都不能使用指向空值的引用。因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向任何物件,這時你應該把變數宣告為指標,因為這樣你可以賦空值給該變數。相反,如果變數肯定指向乙個物件,例如你的設計不允許變數為空,這時你就可以把變數宣告為引用。不存在指向空值的引用這個事實意味著使用引用的**效率比使用指標要高。

合法性區別。在使用引用之前不需要測試它的合法性。相反,指標則應該總是被測試,防止其為空。

可修改區別。指標與引用的另乙個重要的區別是指標可以被重新賦值以指向另乙個不同物件。但是引用則總是指向在初始化時被指定的物件,以後不能改變,但是指定的物件其內容可以改變。

下面幾個函式的區別

void swap1(int p,int q)

值傳遞,a,b兩個數交換不成功。

void swap2(int *p,int *q)

注意上面的temp是乙個指標但是卻沒有進行初始化,然而temp = p確實將p所指向的內容幅值給temp指向的位址,但是temp所指向的位址卻沒有給分配,這裡在給temp指向的記憶體賦值時系統會臨時的給其分配乙個儲存空間,但是這裡分配的記憶體卻不會在函式執行結束時給釋放掉,造成記憶體洩露。

void swap3(int *p,int *q)

仍然是temp是個指標但是其指向的記憶體卻沒有分配,故temp=p是temp也指向p所指向的記憶體(也就是變數a),所以這裡交換只是形參p,q的值,而不是指標所指向的值。

void swap4(int *p,int *q)

void swap5(int &p,int &q)

上面兩個函式分別使用了指標傳遞和引用傳遞,是可以正確的交換兩個數的值的。

字元陣列和字串常量

有如下兩個定義

char str1 = "hello world" ;

char *str2 = "hello world" ;

作為區域性變數時,字元陣列和字串常量的主要區別就是其生命週期不同。字元陣列儲存在棧中,所以在函式呼叫結束時就被銷毀了,字串常量是儲存靜態儲存區域中,在函式呼叫結束時並不會被銷毀。

有下面兩個函式

char *stra()

char *strb()

函式strb返回的是區域性變數字元陣列是不正確的,因為在函式呼叫結束後str及其所指向的儲存空間會被銷毀。但是stra卻是可以的,因為str指向的是乙個字串常量,儲存在靜態儲存區域,在函式呼叫結束時指標str會被銷毀,但是其指向的區域卻不會被銷毀,所以返回其指向的儲存區域是可以的。

對於要返回字元陣列的也如下面這樣處理

char *strb()

將str宣告為static,str就儲存在靜態儲存區域,但是其作用域只是函式內部。

C 基礎(1) 指標

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

C 1 指標的學習

c 中的指標代表的是記憶體中的一段位址,通過指標可以直接訪問記憶體中的具體的位址。指標的定義格式 型別 變數值 int pint eg.宣告了乙個整型的指標變數 指標在宣告的時候最好進行初始化。初始化的方式如下 int pstr null include using namespace std in...

C語言之旅(1)指標

指標是什麼?指標是變數。指標是幹什麼用的?指標是儲存位址的。指標佔多少個位元組?對於32位系統來說是4個位元組,對於64位系統來說是8個位元組,當前大多數用的還是32位系統。這裡面說的系統不是計算機的作業系統,而是計算機架構的定址能力。對於32位系統來說計算機的位址用8位16進製制數表示。因為一位1...