二維陣列名不能作為指標傳遞

2021-09-28 16:00:45 字數 551 閱讀 4835

二維陣列名即陣列位址,指向首行位址,表面上看,行位址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。

如果a[10][10],假設int **p=a; 那麼要對行遞增執行p++時,編譯器如何知道列寬?因為int **是指指向乙個 int 型別的指標,32位系統中int 的寬度為4位元組,即位址寬度是4位元組,因此p將指向下乙個元素(整數指標),也就是p遞增了4位元組,而不是10個int型資料的寬度,這就錯位了。

所以a[10][10]的位址型別不是簡單的指標的指標,而是行指標的指標,而行寬是由你定義的陣列列數和元素型別所決定,int型別就是410=40個位元組。這叫資料對齊。因此編譯器在轉換陣列名時,會根據對齊要求而確定相應的指標型別,所以a的位址型別應該是int ()[10],而不是int **。

所以應該這樣:int (*p)[10]=a;

其含義為,p是乙個指向(含10個int型別元素的一維陣列或行的)指標,其實本質上任何指標都是4位元組(32位系統),你完全可以將一種指標型別強制轉為任何其他型別,那為什麼還要區分指標型別,就是為了指標運算時實現資料對齊,準確定位。

二維陣列名如何作為引數傳遞

在用二維陣列名作為引數傳遞時容易出現segmention error。這是因為不能正確為二維陣列中元素定址的問題,正確的方法如下 cpp view plain copy include include define n 4 void testarray int a,intm,intn intmain...

二維陣列名 二維陣列名取位址 二級指標

先給出結論,便於以後查閱 首先給出幾個定義 typedef int p1x4 4 定義資料型別,p1x4這種型別為指向含4個int元素的1維陣列的指標 typedef int p3x4 3 4 定義資料型別,p3x4這種型別為指向含3x4個int元素的2維陣列的指標 下面從一維陣列說起 定義 int...

C 指標陣列,陣列指標,陣列名,二維陣列

本文較為詳細的分析了關於理解c 指標陣列,陣列指標,陣列名,二維陣列的一些技巧。是比較重要的概念,相信對於大家的c 程式設計有一定的幫助作用。一 關於陣列名 假設有陣列 1 inta 3 1.陣列名代表陣列第乙個元素的位址,注意,不是陣列位址 雖然值相等 是陣列第乙個元素位址,a 等同於 a 0 a...