陣列指標的乙個易錯點

2022-03-04 18:42:48 字數 1198 閱讀 3754

今天測試了乙個程式,來理解一下陣列指標,感覺有所收穫,在此分享。

1

intmain()2;

4int* ptr1=(int *)&a;

5int* ptr2=(int *)(&a+1);6

int* ptr3= ptr1 + 1

;7 printf("

ptr2[0]:%d\n

",ptr2[0

]);8 printf("

ptr3[0]:%d\n

",ptr3[0

]);9

return0;

10 }

首先,大家可以猜測下輸出什麼結果。

我們,接著看,int* ptr1=(int *)&a;為什麼&a前面有個(int *)這裡將其強制轉換型別幹什麼?我們將(int *)去掉編譯試試,編譯器會報錯://「初始化」: 無法從「int (*)[6]」轉換為「int *」;(編譯器為vs2012)這說明&a並不是「int *「型別,而是「int (*)[6]」型別。

好了,我們看到區別了,a是「int *」型別,而&a是「int (*)[6]」型別。但是,只知道這些是沒有意義的,我們繼續往下看;

通過vs2012編譯器觀察,a和&a的位址值是一模一樣的都是0x14fcec,在數值上他們是一樣的!我們再看a + 1的值是多少它是0x14fcf0

我們將0x14fcf0-0x14fcec = 0x04;我們發現(a + 1)的值比a的值大4,這個好理解:因為陣列a是乙個int型陣列所以,而乙個int佔據4個位元組。

我們再比較一下&a和(&a + 1)用0x14fd04 - 0x14fcec = 0x18 = 24;為什麼(&a + 1)比 &a大24呢?我們猜想一下,是不是因為陣列a裡有6個整形數,4 × 6 = 24. 確實是這樣的,不信你可以看看將陣列改成5你看看位址是不是加了20.

現在,我們總結一下,a和&a表示的是同乙個位址,但是他們等級不同(型別不同),a + 1,位址會遞增int的長度,而&a + 1,位址會遞增

int的長度×陣列元素的個數。

在回到,源程式,結果:

ptr2[0]:-858993460//訪問越界了

ptr3[0]:2

若將這個概念用到二維陣列,會怎樣呢?希望大家一起**和分享!

Vuex的乙個易錯點

好長時間不用vuex,發現有些東西記模糊了。在對vuex進行模組化開發的時候,const store new vuex.store 我們可以通過store.state.a取得 modulea 的狀態,在store注入到vue例項的時候,子元件可以通過this.store.state.a取得。但要注意...

陣列易錯點

1.初始化定義 1.int n 常量表示式 常量表示式不能為變數 2.int main 內與int main 外的陣列初始化定義有區別 int main 內初始化為隨機,int main 外初始化值為0 2.資料範圍 a i 的i範圍不能超過常量表示式中的範圍 典型的陣列越界 3.陣列不能夠進行賦值...

指標與陣列的易錯點歸納

序 指標與陣列是c語言中最常見的,其不同已於前面總結過,今天我寫一些我在寫c語言程式中遇到的錯誤,肯定不完整,但也可以作為錯誤總結防止再犯。在寫之前,首先我要總結一點,那就是陣列遠比指標可靠,除了傳送實參和接收形參外,能用陣列的盡量不要用指標。首先第一點,指標最容易出現的問題是野指標,即訪問了一段非...