1. 程式人生 > >陣列指標 int(*P)[3] --行陣列指標

陣列指標 int(*P)[3] --行陣列指標

對於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];

附圖一張: