C C 自學旅程 5 指標和引用

2022-09-14 01:45:08 字數 3229 閱讀 7853

學c語言的時候,指標一直是乙個讓人頭大的東西,懂,但是不會用,還好現在慢慢會了,還好c++的指標還是跟c基本相同,還好如此我就只用記一些不同的東西了:)

一、無名變數(動態變數)

可以用new來建立乙個無名變數,這種變數沒有識別符號,如:

int *p =newint;

可以在動態建立的同時指定初始化列表,如:

double *pdouble;

pdouble = new double(26.7);

之後這個變數就通過指標來間接訪問,如:

cin>>*p;

cout<<*p;

int c = *p+13;

......

一般情況下,稱使用new運算子建立的變數為動態變數,因為這些變數要在程式執行期間動態建立和銷毀。

動態建立的變數要動態銷毀,用delete關鍵字,如:

deletep;

醬紫就刪除了指標p指向的無名空間。

接下來,誰來告訴我這玩意有什麼用?

二、const修飾指標

由前面的學習可以知道,const關鍵字可定義常量,如

const int a=10;

是不能改變的。當const修飾指標,也是不能改的意思,不過他倆結合會有新的火花:

①指向常量的指標

若把const放在宣告變數的最左邊,如:

1

int i=0;2

intj;

3const

int *p = &i;

4 *p = 3; //

錯誤!不能通過p修改所指內容

5 i=2; //

可以6 p=&j;

可以發現,醬,不能再通過p修改所指內容,僅此而已,p所指的東西可以通過別的途徑更改,p的指向也可以改。

②指標常量

1

int * const p = &i;

2 p=&j; //

錯誤,指標不能修改指向

3 *p=2; //

可以

如果要指標指向固定,且不能通過該指標修改所指值,則這樣:

const int * const p = &i;

三、引用

引用就是給乙個變數取個別名,如: 

int

a;int &b = a;

相當於a有了另乙個名字b,只是另乙個名字,系統並沒有分配另外乙個空間給b。用引用可以減少空間消耗。

需要注意的有:引用宣告時必須指定對哪個變數引用,即必須初始化別名不能再被引用不能建立陣列的引用,因為陣列是元素的集合。

下面用大篇幅來說說引用的應用:

①引用作為函式引數

1

//引用作為函式引數的引用傳遞方式

2 #include3

using

namespace

std;

4void fun1(int);5

void fun2(int&);67

intmain()820

21void fun1(int

x)22

2728

void fun2(int&x)

29

執行結果如下:

0x68fe90

在fun1函式內部x=10

主調函式中a=2

0x68feec

在fun2函式內部x=10

主調函式中a=10

可以發現,fun1沒有用引用傳遞,fun1中定義的區域性變數x的位址與實參不同,改變形參的值當然也無法對實參a起到作用。而在fun2中,x並不是新定義的區域性變數,而是對實參a的引用,所以fun2中的x就是a,位址也相同,那麼對引用量x進行變化,實參當然受影響。

總結一下引用傳遞的優點或者特點:

②常引用

如:

const int &b=a;

這樣就不能通過引用對值進行變更了,更加安全咯~據說能使用const的情況下盡量使用const,雖然我現在還不能完全理解這樣做的苦衷。

③引用作為返回值

要用引用作為返回值型別時,函式得這麼定義,如:

int &fun(形參列表)

相信用起來沒有什麼問題吧!~

但是要注意的是:不能返回區域性變數的引用,因為區域性變數被滅的,引用就會「無所指」,程式會進入位置狀態;);也不能引用new定義的動態變數;可以返回類成員的引用,但最好用const。

之後再繼續學吧,好暈啊@~@!

四、動態陣列

原來之前學的動態變數 new/delete 語句是用在這裡啊!申請動態陣列如下:

資料型別 * p = new 資料型別[n];

//其中n可以為變數

deletep;

特別注意刪除語句的形式:p!要加方括號在指標前面。

學到這個,突然回憶起了在c語言的malloc/free函式,c++也是有這個函式的。所以new/delete和malloc/free有什麼不同呢

真是深刻感受到知識都**於生活,小東西也要注意,說不定哪天就派上了大用場。。。不過,不同點第一條(操作物件不同)現在還看不懂。

五、其他指標複習

①函式指標

指向函式的指標。形如:

int (*p)(int,int,int);

p=max;

這樣,p就指向max了。圓括號不能少!

②指向指標的指標

指的物件還是指標。

int *p=&x;

int **p=&p;

③指標陣列

陣列元素為指標型別的資料。

int *p[5];

p.s.   int *p[5] 和 int (*p)[5] 辨析

前者,p優先與結合,所以p是乙個指標,指向乙個有五個資料的陣列。

後者是指標陣列,陣列元素為指標。

陣列中舉結了@~@

C C 程式設計04(指標和引用 遞迴)

第七章 指標和引用 遞迴 1.指標和引用的而區別 首先1,指標是非空性,而引用總是指向某些物件 必須宣告時初始化 不存在指向空值的引用。其次2,合法性,指標總是在使用前測試是否為空指標,引用不用測試。再次3,可修改,指標可以重新賦予新的位址指向不同物件,而引用則始終指向初始化時指定的物件,但是指定物...

5 指標 引用的區別

函式傳值的三種方式 傳值 傳引用 傳指標 相同點 都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體 在棧空間有自己的記憶體空間 而引用僅是個別名 不佔記憶體空間 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次...

7 4 指標和引用

7.4.1指標的好處 1.可以動態分配記憶體。2.對多個相似變數進行一般訪問。3.為動態資料結構,尤其是樹和鍊錶提供支援 4.遍歷陣列,解析字串。5.高效的按引用複製陣列和結構。7.4.2 引用還是指標 1.指標本質是儲存位址的變數,指標則是 從一而終 的別名,且不能為空 2.作為引數傳遞,二者不同...