陣列和auto的問題。

2021-08-20 05:24:42 字數 2172 閱讀 6391

寫在前面的話:可以先看看文章末尾的總結,如果可以明白答案就不必浪費時間。如果想看內容建議先了解一下陣列指標的問題,比如大概知道 int(*)、int **、int(*)這些都代表什麼。

在看書時學習了範圍for,於是乎就操作一下

int arr[5]=;

for(auto i:arr)

cout

《跑了一下感覺挺舒服,減少**長度,看起來也很簡潔,而且不用考率陣列越界等什麼亂七八糟的問題。那麼乙個二維陣列的範圍for怎麼寫呢?我抖了個激靈大手一揮寫下下面的**

int arrt[2][3]=;

for(auto i:arr)

for(auto j: i)

cout<

感覺自己很機智,巧用i來做內層範圍,然而編譯一下……bang~炸了。網上搜了一下說要這麼寫

int arrt[2][3]=;

for(auto &i:arr)

for(auto j: i)

cout<

why?僅僅相差乙個&(引用),就導致不同的結果。google一番,各種花式解決問題,但是根本不能說明其到底為什麼錯誤。各種分析含糊其詞有甚者大談特談int**型別。好吧,幸好我讀了一點點書,不然就信了他們的鬼話。於是就只能自己慢慢往出來試了。(我承認部落格有錯誤是正常的,每個人在初學的時候都有理解不透徹的時候,但是在查詢很久仍然沒有找到結果的我心裡很難受,忍不住想要吐槽……這就像現在正在看這個部落格的你一樣,心裡在大罵這個博主戲精乙個,廢話真多,說了這麼多還沒講到重點,浪費我時間……)好好好,廢話就不說了我們開始來思考這個問題。

#include 

#include

using

namespace

std;

int main()

;//ok,這是乙個二維陣列,下面讓我們看看arrt到底是個什麼玩意

int (*p0)[2][3]=&arrt;//可以看到arrt這個變數的位址是乙個int(*)[2][3]型,並不是什麼int**,可以用乙個這樣的指標指向這樣的陣列。

int (*p1)[3]=arrt;//arrt是乙個二維陣列,他的陣列名表示乙個他裡面的第乙個一維陣列的首位址,可以用乙個型別int(*)[3](長度為三的一維陣列指標)來指向他。

int *p2 =arrt[0];//arrt[0]這是乙個一維陣列,他表示一維陣列的第乙個元素的首位址(int *),自然可以讓int *來指向他。

//搞清楚這些,我們來看看auto乙個陣列有什麼結果(可以和上面對比)

auto &art0=arrt;//q0,乙個二位陣列(別名)

auto q0=&arrt; //q1,乙個int(*)[2][3](指向乙個兩行三列的陣列指標)

auto q1=arrt; //q2,乙個int(*)[3](指向乙個長度為三的一維陣列指標)

auto q2=arrt[0];//q3,乙個int *(指向乙個int型)

/* 這裡我們可以看出:aout加上&,結果是引用乙個陣列

auot不加&,結果是其對應的指標

這就是問題的關鍵,乙個是 陣列,乙個是指標。下面是列印他們的型別。

*/cout

<<"arrt= "

<<<"p0 = "

<<<"p1 = "

<<<"p2 = "

<<<"art0= "

<<<"q0 = "

<<<"q1 = "

<<<"q2 = "

<#include #include using namespace std;

int main()

;//ok,依然這是乙個二維陣列

/***

for(auto i:arrt)

這裡是要把arrt的第乙個元素拿出來對i進行初始化,具體看下面

*/for(auto i:arrt)//auto i=arrt[0];

for(auto &i:arrt)//auto &i=arrt[0];

/***

有了上面的分析,我們很容易知道,第乙個i是乙個指標(int *)

第二個i是乙個陣列(引用)

而在範圍for迴圈裡面的範圍(只能是乙個集合,例如陣列,string,vector……)是不允許是乙個指標的。

所以編譯器自然就會報錯。

*/}

auto 和 decltype的區別

auto和decltype都是型別推斷的兩種方式,但之間又有區別。主要有這幾個方面的區別 1.auto是通過編譯器計算變數的初始值來推斷型別的,decltype同樣也是通過編譯器來分析表示式進而得到它的型別,但是它不用將表示式的值計算出來。2.編譯器推斷出來的auto型別有可能和初始值型別不同,比如...

auto 和 decltype 的區別

auto 和 decltype 都是型別推斷的方式 區別如下 1 auto 是通過編譯器計算變數的初始值來推斷型別,decltype同樣也是通過編譯器來分析表示式進而得到它的型別,但是它不用將表示式的值計算出來 2 編譯器推斷出來的auto型別可能與初始值型別不同,眾多周知,使用引用實際是使用引用的...

基於 range 的 for 迴圈和 auto

c 11 引入一種迴圈的新形式,叫基於 range 的 for 迴圈,它允許我們用更簡單易讀的形式遍歷容器中的所有元素 vectorv for int i v 可以使用 auto 來讓編譯器來推導元素的型別,上面的迴圈可以改寫為 for auto i v 根據 auto 的推導規則,推導出的型別是初...