寫在前面的話:可以先看看文章末尾的總結,如果可以明白答案就不必浪費時間。如果想看內容建議先了解一下陣列指標的問題,比如大概知道 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 的推導規則,推導出的型別是初...