【C++】C++自学旅程(5):指针和引用
學C語言的時候,指針一直是一個讓人頭大的東西,懂,但是不會用,還好現在慢慢會了,還好C++的指針還是跟C基本相同,還好如此我就只用記一些不同的東西了:)
一、無名變量(動態變量)
可以用new來創建一個無名變量,這種變量沒有標識符,如:
int *p = new int;可以在動態創建的同時指定初始化列表,如:
double *pdouble; pdouble = new double(26.7);之后這個變量就通過指針來間接訪問,如:
cin>>*p; cout<<*p; int c = *p+13; ......一般情況下,稱使用new運算符創建的變量為動態變量,因為這些變量要在程序運行期間動態創建和銷毀。
動態創建的變量要動態銷毀,用delete關鍵字,如:
delete p;醬紫就刪除了指針p指向的無名空間。
接下來,誰來告訴我這玩意有什么用?
?
二、const修飾指針
由前面的學習可以知道,const關鍵字可定義常量,如
const int a=10;是不能改變的。當const修飾指針,也是不能改的意思,不過他倆結合會有新的火花:
①指向常量的指針
若把const放在聲明變量的最左邊,如:
1 int i=0; 2 int j; 3 const 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 #include<iostream> 3 using namespace std; 4 void fun1(int); 5 void fun2(int&); 6 7 int main() 8 { 9 int a=2; 10 cout<<"實參a的地址是:"<<&a<<endl; 11 12 fun1(a); 13 cout<<"主調函數中a="<<a<<endl; 14 15 fun2(a); 16 cout<<"主調函數中a="<<a<<endl; 17 18 return 0; 19 } 20 21 void fun1(int x) 22 { 23 cout<<"值傳遞中,形參x的地址是:"<<&x<<endl; 24 x=10; 25 cout<<"在fun1函數內部x="<<x<<endl; 26 } 27 28 void fun2(int& x) 29 { 30 cout<<"引用傳遞中,形參x的地址是:"<<&x<<endl; 31 x=10; 32 cout<<"在fun2函數內部x="<<x<<endl; 33 }運行結果如下:
實參a的地址是:0x68feec 值傳遞中,形參x的地址是:0x68fe90 在fun1函數內部x=10 主調函數中a=2 引用傳遞中,形參x的地址是: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可以為變量相當于p指的是這個空間的收地址,跟數組一樣咯,但是可以自由控制n的大小了。用完后刪除:
delete []p;特別注意刪除語句的形式:[]p!要加方括號在指針前面。
溫馨提示:使用了new,指針p就不要更改了,免得出現錯誤。
學到這個,突然回憶起了在C語言的malloc/free函數,C++也是有這個函數的。所以new/delete和malloc/free有什么不同呢?好奇搜索了一下,原來這是百度的一個筆試題。。。
《百度筆試題:malloc/free與new/delete的區別》by CSDN?hackbuteer1
真是深刻感受到知識都來源于生活,小東西也要注意,說不定哪天就派上了大用場。。。不過,不同點第一條(操作對象不同)現在還看不懂。
?
五、其他指針復習
①函數指針
指向函數的指針。形如:
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是一個指針,指向一個有五個數據的數組。
后者是指針數組,數組元素為指針。
?
數組中舉結了@~@
?
轉載于:https://www.cnblogs.com/HappyCtest/p/5176931.html
總結
以上是生活随笔為你收集整理的【C++】C++自学旅程(5):指针和引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优化Linux内核参数/etc/sysc
- 下一篇: codeblocks c++ 编译出错