陣列指標 int(*P)[3] --行陣列指標
阿新 • • 發佈:2019-02-03
對於int(*p)[3]和int*p[3]一直迷糊,一直迷糊。
今天總結一下int(*p)[3]
int (*p)[3]是陣列指標(其實p是一個二級指標,*p也是指標。p指向陣列,*p指向陣列的首元素,**p才是首元素的值),p也稱為行陣列指標。p指向的是一個裝有3個int型別一維陣列的指標。p+1指向一下一個裝有3個數據的一維陣列。
p是一個行指標(二級指標),每行有3個in資料。*p是資料1的地址,*p+1是資料2的地址 *p+2是資料3的地址。
int* q;p與q是完全不同的指標了。q是指向的int型別的資料。所以賦值 p=q是錯誤的。
#include <iostream> using namespace std; void main() { //例子1 int Test[3]={1,2,3}; // 若果 int Test[4]={1,2,3,4}就錯誤了,因為B只能指向有3個元素的陣列 int (*B)[3]; B=&Test; cout << **B <<endl;//1 cout << *(*B+1) <<endl;//2 B++; cout <<**B <<endl;//-858993460 已經在陣列外了 //例子2 int a[]={1,2,3,4,5,6,7,8,9,10}; typedef int(*A_Type)[3]; A_Type p; p=(A_Type)&a[0]; cout << **p << **(p+1) <<endl; //1 4 恰好說明p型別的特點。 //p是行指標,*p指向第一行的首地址 //*p+0是第一行的第1個元素地址 *p+1是第一行第二個元素地址 *p+2是第一行第三個元素 cout << *(*p+0) << endl; //1 cout << *(*p+1) <<endl; //2 cout << *(*p+2) <<endl; //3 //p+1是第二行的首地址 //*(p+1)+1是第二行的第1個元素地址 cout << *(*(p+1)+0) <<endl;//4 cout << *(*(p+1)+1) <<endl;//5 cout << *(*(p+1)+2) <<endl;//6 }
因為是行指標(一行裡有3個int型別資料)。讓我想到了二維陣列。
int a[4][3] 陣列a有4個數據(一維陣列),每個數組裡有3個int型資料。
int a[4][3]={ {11,12,13} , {21,22,23} , {31,32,33} , {41,42,43}}
第一個大資料 第二個大資料 第三個大資料 第四個大資料 每個資料裡面有3個數據。
理解a[4] ={ {},{},{},{} }。a指向首地址,a+1指向 第二個資料成員,a+2指向第三個,a+3指向第4個。
這時候,發現a 與 int(*p)[3]中的p是一樣的型別。所以可以用a給p賦值。
#include <iostream> using namespace std; void main() { int a[4][3]={ {11,12,13} , {21,22,23} , {31,32,33} , {41,42,43}}; int (*p)[3]; p=a; cout << *(*p+0) <<endl;//11 p=p+1; cout << *(*p+0) <<endl;//21 /*int(&r)[3]=a[2];// 一個int[3] 型別的引用,指向a中第一個元素 p=&r;*/ //指標指向這個地址 對引用取地址 p=&a[2]; //直接對a[2]取地址 cout << **p <<endl;//31 }
這裡只討論,行陣列指標(其實這個指標式二級指標,因為*p還是一個指標。**p才是一維陣列的第一個資料的值。
要記住啊int(*p)[3];
附圖一張: