最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

業(yè)余一下,淺顯了解如何new一個數(shù)組,及其他相關(guān)的簡單內(nèi)容(?業(yè)余找噴(bushi

2023-08-05 00:18 作者:洛茨Deadcat  | 我要投稿

免責(zé)聲明

反正也沒人看本來沒打算寫,但還是套個盾)

因?yàn)闇\顯了解,所以文章語言淺薄片面。

因?yàn)楸救艘彩切率?,所以錯誤很多,歡迎指出。

因?yàn)榈谝淮螌懜?,所以思路不清語言混亂。

因?yàn)槭潜救擞^點(diǎn),所以不代表大眾。

---------------------以下省略

此文章主要是面向跟我一樣的新手或者非專業(yè),沒有經(jīng)過系統(tǒng)化學(xué),只想簡單了解的人進(jìn)行淺顯補(bǔ)充。


new一個數(shù)組

如果你已經(jīng)百度過了,應(yīng)該已經(jīng)知道了,所以直接上語法。

new T[]{};

new為關(guān)鍵詞,T為數(shù)組的數(shù)據(jù)類型,[]內(nèi)為數(shù)組元素個數(shù),也就是數(shù)組長度,{}為c++11所加可以初始化數(shù)組的數(shù)據(jù)。

同new的其他對象一樣,由于new返回的是一個適當(dāng)類型的非零指針(或者可以理解為內(nèi)存地址),可以拿一個適當(dāng)類型的指針來接收返回?cái)?shù)據(jù):?

祝:在有些文章里都會說,new的時候加了[]的,delete也都需要加[],即delete []p,但其實(shí)是不必要的。[]的作用只是調(diào)用每一個對象的析構(gòu)函數(shù),而對于簡單的整數(shù)數(shù)組這種不需要調(diào)用析構(gòu)函數(shù)的,有無[]都無妨。只有用到了析構(gòu)函數(shù)的類才需要加[]。(但是當(dāng)然,形成好的代碼習(xí)慣應(yīng)該是好的)例:

那么最經(jīng)典的問題就來了:

指針指向的是數(shù)組哪里的地址?

"如果你已經(jīng)百度過了",那么肯定知道指向數(shù)組的指針指向的是數(shù)組首元素地址。

那么什么是數(shù)組

那么因此可以直接進(jìn)行以下的簡單操作:

建議無視綠色波浪線

3個cout從上往下的操作依次是:

1.直接解引用指針ptr,因?yàn)橹赶虻臄?shù)組的首元素地址,所以解引用后的值是1,也就是第0位數(shù)。

2.返回ptr指向的地址的后一位地址(或者說首地址+1,因?yàn)閿?shù)組是用一串連續(xù)的內(nèi)存存儲的),也就是數(shù)組的第1位數(shù),也就是2。

3.++ptr是先將ptr指向的地址向后移動一位,也就是原本指向數(shù)組0的位置,現(xiàn)在指向了1的位置,所以輸出值是2。

當(dāng)然,也可以直接用下標(biāo)運(yùn)算符進(jìn)行索引,例如ptr[3],返回的結(jié)果就是4。

數(shù)組

首先我們先簡單聲明一個名為arr的有3個元素的int類型的數(shù)組,并進(jìn)行初始化:

int arr[3] = { 1,2,3 };

那么又來到了一個經(jīng)典問題:數(shù)組名是不是一個指向首元素地址的指針。

(先打個甲,個人觀點(diǎn)來說)數(shù)組名本身不是指針。盡管數(shù)組確實(shí)可以直接進(jìn)行一些指針的操作:

在進(jìn)行以上操作的時候arr確實(shí)變成了一個指向首元素地址的指針。這兩個cout的輸出結(jié)果也同上面的那個指針一樣。

但是這只是表明在進(jìn)行該運(yùn)算的時候arr轉(zhuǎn)變成了指針類型。

從比較直觀的來看一下arr和ptr的區(qū)別。

對于輸出arr和ptr的內(nèi)存時,arr輸出的是4*3,即含有3個int元素的數(shù)組的總內(nèi)存。而ptr只是輸出的指針本身的內(nèi)存大小。且當(dāng)arr前加運(yùn)算符的時候,arr的內(nèi)存轉(zhuǎn)變?yōu)榱?字節(jié),也就是一個指針的大小。

用decltype()捕獲數(shù)據(jù)類型時,對于ptr得到的是一個int的指針類型,對于整體的arr得到的是一個int[3]的數(shù)組類型。而當(dāng)arr進(jìn)行運(yùn)算的時候arr隱式轉(zhuǎn)換為了一個int*類型。

那么便得到了一個結(jié)論,也就是數(shù)組在進(jìn)行運(yùn)算的時候會隱式轉(zhuǎn)化為指向首元素地址的指針,但是arr本身代表的是整個數(shù)組。

那么由此可得,為什么ptr直接指向一個數(shù)組的時候可以不需要取址符&:

int arr[5] = { 1,2,3,4,5 };

int* ptr = arr;

而實(shí)際上這個操作用指向數(shù)組這個說法是不準(zhǔn)確的,它實(shí)際上不過是數(shù)組名先隱式轉(zhuǎn)化為指向首元素地址的指針,然后把指針指向的值賦值給ptr。

int (*ptr)[5] = &arr;

這個才是真的把數(shù)組本身的地址傳給了指針。

輸出結(jié)果:4*5

解引用之后的大小是一個完整的數(shù)組的大小。

且索引時需要先解引用再索引,即:(*ptr)[2]?

最后補(bǔ)充幾個細(xì)節(jié):

1. &arr 和 arr 與?&arr + 1 和 arr + 1

第一行是&arr 和 arr的地址

第一行是&arr + 1?和?arr +?1的地址

&arr取得是整個數(shù)組的地址也就是數(shù)組的首地址。

arr是直接先將arr轉(zhuǎn)化為指針,然后輸出了指針指向的地址,也就是數(shù)組的首元素地址。

從第一行可以看出來,首地址和首元素地址確實(shí)是相等的。

但當(dāng)&arr + 1?和?arr +?1后地址變得不相同了。

因?yàn)閍rr+1根據(jù)上面所說只是首元素地址加一也就是數(shù)組中的下一個元素。

但&arr+1是整個數(shù)組的地址加一,等同于int a=1; &a+1; 用不準(zhǔn)確的話來說,他是直接跳過了整個數(shù)組的地址指向了之后的數(shù)據(jù),至于之后的數(shù)據(jù)是什么那就不知道了。

經(jīng)過計(jì)算也可以得出:

C=12

000000B4830FFBDC-000000B4830FFBD8=?4?= sizeof(int) * 1(這里*是乘號)

000000B4830FFBDC-000000B4830FFBD8便于理解可以轉(zhuǎn)化成10進(jìn)制再算(只轉(zhuǎn)換最后幾位)

D=13 , E=14

16進(jìn)制D8?= 十進(jìn)制13*16^1+8*16^0 = 216? ??16進(jìn)制E4?= 十進(jìn)制14*16^1+4*16^0 = 228

228-216=16=sizeof(arr)=sizeof(int)*3

2.數(shù)組名隱式類型轉(zhuǎn)換為指針類似于指針常量

這個其實(shí)沒什么好說的,因?yàn)閿?shù)組名轉(zhuǎn)換為指針后,指針常指向數(shù)組的首元素地址,不可做為左值。

所以幾乎等于指針常量

3.int*?p[5] 和 int (*p)[5]

為什么上面?int (*ptr)[5] = &arr; 定義指向數(shù)組的指針時的定義方法是int (*p)[5]而不是int* p[5]

因?yàn)樵赾++中,[]的優(yōu)先級高于*,int* p[5]=(int*)(p[])。就和int(arr[]),char(arr[]),甚至是class類 className(arr[])一樣。他會先定義一個p的數(shù)組,然后再去確定數(shù)組存儲的是什么數(shù)據(jù),所以int* p[5]實(shí)際上是定義了一個長度為5的可以存儲int*的數(shù)組。

而int (*p)[5]則是改變了優(yōu)先級,先定義一個*p的不知道什么類型的指針,然后再去確定是一個int[]的類型。

業(yè)余一下,淺顯了解如何new一個數(shù)組,及其他相關(guān)的簡單內(nèi)容(?業(yè)余找噴(bushi的評論 (共 條)

分享到微博請遵守國家法律
张掖市| 石城县| 深水埗区| 大荔县| 武邑县| 阳原县| 达拉特旗| 财经| 城固县| 扶绥县| 伊川县| 济南市| 榆社县| 西宁市| 三穗县| 武陟县| 东宁县| 墨竹工卡县| 于都县| 阜城县| 天长市| 本溪| 商丘市| 霍州市| 乡城县| 遂昌县| 西畴县| 长宁区| 开远市| 丹凤县| 淮安市| 大新县| 准格尔旗| 隆林| 上高县| 威信县| 鹤庆县| 山阴县| 平邑县| 泸定县| 耒阳市|