日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++】C++自学旅程(5):指针和引用

發布時間:2025/3/14 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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):指针和引用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。