*p[3]這個是乙個指標陣列,它所代表的意思是陣列中的每乙個元素都是乙個指標變數,
而(*p)[3],p是乙個指標變數,表示指向乙個含有3個整型元素的一維陣列。
view code
int嚴格的將,c++中沒有多維陣列,通常所指的多維陣列其實就是陣列的陣列,比如int arry[3][4];表示乙個長度為3的陣列,陣列中的每個元素是乙個長度為4的陣列。在使用多維陣列時,記住這一點有利於理解其應用。i,j;
int a[2][3]=; //
int *p[3] ; //
表示乙個陣列,陣列中的元素是指標型別,一共有三個元素
int (*q)[3]; //
是乙個指標,指向乙個含有三個int型的陣列(q+1)會跳三個陣列元素
//把第一行三個元素位址存放在p指標陣列中
for( i=0;i<3;++i)
p[i]=&a[0
][i];
//輸出指標陣列中位址所對應值
for( j=0;j<3;++j)
cout
<< *p[j]<
";//
輸出結果為:3,4,5
cout<
q=a;//
把陣列a開始位址賦給指向一維陣列q;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout
<< *(*(q+i)+j)<
"; //
輸出陣列中元素
system(
"pause
");
下面來講講多維陣列與指標的關係。與普通陣列一樣,使用多維陣列時,實際上將其自動轉換為指向該陣列第乙個元素的指標。也就是說,陣列的名字是乙個指向該陣列中第乙個元素的指標,在一維陣列中,arry==&arry[0],這兩個位址是一樣的。在二維陣列中,陣列名稱指向第乙個元素,第乙個元素是乙個長度為4的陣列。我們定義乙個指向長度為4的陣列的指標 int (*p)[4],然後可以將二維陣列的首位址賦值給它,p=arry。這樣是可以進行賦值的。這裡同樣滿足arry==&arry[0]。
知道了二維陣列名字與指標的關係,那麼我們在進行二維陣列傳參的時候就會好理解很多,以前二維陣列傳參是一直讓人頭疼的問題。這裡我們還是將二維陣列名字作為實參來傳遞,在接受函式的形參中,我們只需要定義乙個指向具體長度為陣列的指標即可,比如我們這裡使用 int (*p)[4]來接受arry這樣的引數。下面給出**例項。
view code
#include#include上述乙個簡單的列印二維陣列的簡單例子,重點是二維陣列的傳參。using
namespace
std;
//陣列名字是乙個指向陣列首元素的指標,這裡我們定義乙個指向陣列的指標來接受arry
//r表示二位陣列的行數,c表示二維陣列的列數。
void printarry(int (*arry)[4],int r,int
c) cout
<
}}void
main()
,,};
printarry(arry,
3,4);//
等價於printarry(&arry[0],3,4);
system("
pause");
}
在上述示例中,形參必須指明這個arry指標是指向乙個長度為多少的陣列,如int (*arry)[4]必須指明為4,有一定的侷限性,那麼有沒有更好的方法呢。答案是有的。考慮到二維陣列在記憶體中佔據連續的空間這乙個特性,我們可以用以為陣列來表達二位陣列。將上述printarry方法進行改寫,改寫結果如下:
view code
#include#includeusing
namespace
std;
//傳入陣列的指標,二維陣列的行數與列數
void printarry2(int *arry,int r,int
c) cout
<
}void
main()
,,,};
printarry2(&arry[0][0],4,4);//
傳入陣列中的第乙個陣列中的第乙個元素的位址
system(
"pause");
}
二位陣列與指標
include include using namespace std void disparry int a 2 3 int main void c是乙個指標,指向的元素int 3 即arr的行元素 int c 3 arr int p p int arr p指向arr 0 0 也可以說是arr 0...
二位陣列和指標(參考)
二維陣列和指標 用指標表示二維陣列元素。要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。我們知道,乙個二維陣列在計算機中儲存時,是按照先行後列的順序依次儲存的,當把每一行看作乙個整體,即視為乙個大的陣列元素時,這個儲存的二維陣列也就變成了乙個一維陣列了。而每個大陣列元素對應二維陣列...
C語言二位陣列
前言 今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示 1 include 2 void print int a 3 3 67intmain 8 10print a 11return0...