基礎複習 三 指標與引用

2022-05-19 06:52:50 字數 3388 閱讀 6702

指標基本問題

傳遞動態記憶體

1.錯誤示例:

#includevoid getmemory(char* p, int num) 

int main()

正確示例1:使用指標的指標

#includevoid getmemory(char**p, int num) 

int main()

正確示例2:使用返回值

#includechar* getmemory(char*p, int num) 

int main()

正確示例3:使用指標的引用(前面兩種是書上的,但是這種也可以,而且傳引用似乎開銷更小)

#includevoid getmemory(char* &p, int num) 

int main()

2.下面函式有什麼問題?

```c++

char* stra()

```解析:

因為這個函式返回的是區域性變數的位址,當呼叫這個函式後,這個區域性變數str就釋放了,所以返回的結果是不確定的且不安全,隨時都有被收回的可能。

首先要複習一下c程式的記憶體布局。那麼這裡的str裡存放的是函式stra棧幀裡「hello world」陣列的首位址,函式呼叫結束後棧幀恢復到呼叫stra之前的狀態,臨時空間被重置,stra棧幀不再屬於可訪問的範圍,存在於stra中的區域性變數——「hello world」陣列自然也不能訪問了。

可以考慮改成以下:

char* stra()
此時,「hello world」是作為乙個字串常量存在於資料段中的,而不是在stra的函式棧中,此時返回乙個指標,指標指向資料段中(唯讀區)的這個字串常量的位置,自然就可以成功訪問。而這裡,試圖修改str是不合法的,如*str='n'會報錯。

也可以使用static開闢一段靜態儲存空間:

const char* stra()
補充:感覺關於記憶體分布的部分,還是這一篇講的比較完整:c++記憶體分布!!!

3.下面程式的輸出結果?

#includeclass a 

~a(){}

void fun()

private:

int m_a;

int m_b;

};class b

~b();

void fun()

private:

int m_c;

};int main()

解釋:

輸出結果為1.

強行把a類的記憶體當做b來處理。pb->fun()呼叫的是b::fun()來列印m_c。而m_c是b類物件的唯一元素,對應的也就是a類記憶體中存放的第乙個元素,也就是m_a。所以列印了1.

4.下面程式的輸出?

```c++

#include#includeusing namespace std;

class a

void print()

};class b: public a

};int main()

**解析:**

b類中的a把a類中的a「隱藏」了。在構造b類時,先呼叫a類的建構函式。所以a類的a是1,b類的a是2.輸出是12

- `const char * const * keyword1` keyword1是乙個二級指標變數,這個二級指標指向乙個一級指標常量(不能通過修改這個二級指標去修改一級指標中的值),這個一級指標常量指向乙個字元常量(不能通過這個一級指標修改這個字元的值)

- `const char *keyword2` keyword2是乙個指標變數,指向乙個唯讀(不可通過該指標修改)的字元

- `const char * const keyword3` keyword3是乙個指標常量,指向乙個唯讀(不可通過該指標修改)字元

- `const char keyword4` keyword4是乙個字元常量

ps:主要就是記住*是和右邊結合的,const和*的位置關係就可以知道這個變數究竟是什麼了.const總的來說其實只是從編譯的語法語義上去進行限定以便更好的程式設計,實際上還是可以通過其他方式修改變數的值。

####函式指標

1.示例程式:

```c++

#includeint max(int x, int y)

int main()

ps:的優先順序比*高

指標陣列和陣列指標

1.下面程式的輸出?

#include#includeusing namespace std;

int main() , };

int (*a)[10] = v;

cout << **a << endl;

cout << **(a+1) << endl;

cout << *(*a+1) << endl;

cout << *(a[0]+1) << endl;

cout << *(a[1]) << endl;

}

解析:

1 11 2 2 11

a是乙個指向10個int陣列的指標,因此a+1表明指標向後移動1*sizeof(陣列大小)

2.下面程式的輸出?

```c++

#include#includeusing namespace std;

int main() ;

int ptr = (int)(&a+1);

cout << *(a+1) << " " << *(ptr-1) << endl;

}

**解析:**

2 5####迷途指標

- [空指標、迷途指標、野指標](

####指標和控制代碼

什麼是控制代碼來著好難好難...我下次要去實驗室拿回《c++ primer》重新看一下...

- [智慧型指標與控制代碼類(一)](智慧型指標與控制代碼類(二)](智慧型指標與控制代碼類(三)](

- [系統意義上的控制代碼](

- [比較好的實踐(關於控制代碼)](

- [其他一些資料](

嗯...等看完書再回頭看這些資料...

- [c++ 智慧型指標用法詳解](

####this指標

[ibm的面試題和解析](

-----

from《程式設計師面試寶典》

ps:怎麼說呢,感覺書上很多的這些題目的結果都是針對32位機器?雖然題目沒有指明不夠嚴謹,但是熟悉計算機中的實際操作和儲存一般也就知道實際結果了.

2017 09 11指標複習

1.指標 一段記憶體的位址 本質就是變數 資料 注意 空指標,野指標 2.指標的操作 取決於什麼型別的指標 3.指標訪問資料,訪問範圍 4.指標陣列,陣列指標 指標陣列 int p 陣列指標int p 5.常量指標,指標常量 const char p 常量指標 char const p 指標常量 6...

C語言複習(三) 指標(一)

指標在c語言中是比較重要的,個人認為,c語言中最重要的是記憶體,如何操作記憶體是至關重要的,指標是c語言的精華,學好了指標才可以說c語言入了門。接下來認真總結一下c語言中指標的用法。資料型別的本質是固定大小記憶體塊的別名,指標毫無例外,指標也是占有記憶體空間的,在32位機器中,指標是佔4個位元組的,...

09 11 08 指標與引用的區別

引用和指標 相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 4.引用沒有 const,指標...