自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

EasyC++,C++指針初探之三

開發(fā) 后端
我們前面使用指針創(chuàng)建的都是單個變量,在這種情況下,使用指針的優(yōu)勢并不明顯。很多程序員仍然會選擇使用聲明變量的方式,而當(dāng)我們需要動態(tài)創(chuàng)建數(shù)組這種大型數(shù)據(jù)的時候,指針就能體現(xiàn)出優(yōu)勢了。

[[431992]]

大家好,我是梁唐。

我們前面使用指針創(chuàng)建的都是單個變量,在這種情況下,使用指針的優(yōu)勢并不明顯。很多程序員仍然會選擇使用聲明變量的方式,而當(dāng)我們需要動態(tài)創(chuàng)建數(shù)組這種大型數(shù)據(jù)的時候,指針就能體現(xiàn)出優(yōu)勢了。

我們使用聲明的方式創(chuàng)建的數(shù)組在編譯時就已經(jīng)分配好了內(nèi)存空間了,即使我們在程序當(dāng)中完全不使用,它也依然存在占用了資源。這種編譯時給數(shù)組分配內(nèi)存被稱為靜態(tài)聯(lián)編(static binding),意味著數(shù)組是在編譯時加入程序的。

而使用new創(chuàng)建的數(shù)組則是在運行時,我們前文也說過,兩者最大的區(qū)別在于一個是棧內(nèi)存一個是堆內(nèi)存。我們可以用程序去控制它是否創(chuàng)建,以及在什么情況下創(chuàng)建,并且數(shù)組的長度。因此這種數(shù)組被稱為動態(tài)數(shù)組(dynamic array),這種創(chuàng)建方式稱為動態(tài)聯(lián)編(dynamic binding)。

創(chuàng)建數(shù)組

使用new創(chuàng)建數(shù)組很容易,和聲明的方式一樣,只需要將數(shù)組的類型以及元素數(shù)量寫明即可。

  1. int *arr = new int[10]; 

new運算符會申請一塊10個int大小的內(nèi)存,并且將第一個元素的地址進(jìn)行返回給指針arr。

對于使用new創(chuàng)建的數(shù)組,我們同樣也可以使用delete來釋放,但需要注意的是,由于我們申請的是數(shù)組類型,所以在delete的時候也需要寫明這是一個數(shù)組:

  1. delete [] arr; 

如果不加方括號,那么delete僅僅會釋放指針指向的元素也就是數(shù)組的第一個位置。所以我們在使用new和delete的時候一定要注意,在創(chuàng)建時如果使用了方括號申請了數(shù)組,那么在delete的時候也需要加上方括號。如果不匹配則可能會引發(fā)不確定的后果,所以千萬要當(dāng)心。

C++ Primer當(dāng)中整理了幾條規(guī)則,搬運過來:

  • 不要使用delete釋放不是new分配的內(nèi)存
  • 不要使用delete釋放同一塊內(nèi)存兩次
  • 如果使用new[]為數(shù)組分配內(nèi)存,則也應(yīng)該使用delete[]來釋放
  • 如果使用new為非數(shù)組分配內(nèi)存,應(yīng)該使用delete來釋放
  • 對空指針delete是安全的

使用動態(tài)數(shù)組

聊完了delete的用法, 我們再來看看動態(tài)數(shù)組的使用。

這里有一個問題在于,我們通過new創(chuàng)建得到的雖然是一個數(shù)組,但是卻是以指針的形式得到的,那么我們怎么來使用呢?

其實很簡單,我們就當(dāng)做和數(shù)組一樣來使用就行了:

  1. int *p = new int[10]; 
  2.  
  3. p[2] = 5; 
  4. cout << p[2] << endl; 

因為數(shù)組本質(zhì)上就是常量指針,因此它們基本等價。唯一的不同在于數(shù)組是常量指針,所以我們不能對數(shù)組名進(jìn)行賦值操作,而指針可以:

  1. p = p + 1; 
  2. ++p; 

是的,指針可以進(jìn)行算術(shù)操作,對于指針進(jìn)行加減操作其實等價于指針的移動。比如指針加一代表指向的元素向后移動一位。

原本p指針指向數(shù)組的下標(biāo)0的位置,當(dāng)p++之后,指向1的位置。因為數(shù)組是一塊連續(xù)的內(nèi)存,不同類型的變量的長度不同。因此在底層運算的時候,指針指向的位置移動的長度其實并不是1,而是一個變量類型占用的字節(jié)數(shù)。

同理,指針也可以做減法,得到的差是一個整數(shù)。這種運算只有兩個指針指向同一個數(shù)組才有意義,代表兩個指針之間間隔的元素數(shù)量。

本文轉(zhuǎn)載自微信公眾號「Coder梁」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Coder梁公眾號。

 

責(zé)任編輯:武曉燕 來源: Coder梁
相關(guān)推薦

2021-10-27 16:27:20

C++指針操控

2021-12-12 18:13:54

C++This指針

2021-10-26 00:19:51

C++結(jié)構(gòu)體存儲

2021-11-09 10:38:16

C++Const指針

2021-10-31 20:24:24

C++for循環(huán)

2021-10-21 18:52:00

C++數(shù)組存儲

2021-11-10 10:48:36

C++函數(shù)指針

2021-12-29 20:31:40

C++多態(tài)指針

2021-11-01 15:35:31

C++自增自減

2021-10-20 14:03:06

C++運算符類型

2021-12-09 10:56:50

函數(shù)C++原型

2021-11-26 00:03:20

C++編譯常量

2021-10-28 19:27:08

C++指針內(nèi)存

2021-12-08 10:43:09

C++實現(xiàn)

2021-12-10 10:45:36

C++函數(shù)Stock

2021-12-30 14:58:58

C++函數(shù)動態(tài)

2021-11-27 11:50:09

C++靜態(tài)持續(xù)

2021-12-11 19:02:03

函數(shù)C++對象

2021-12-15 10:25:57

C++運算符重載

2021-12-05 18:20:42

C++空間特性
點贊
收藏

51CTO技術(shù)棧公眾號