行指针(对二维数组,多维数组的深层理解)

行指针

  • 定义
  • 对二维数组的理解
  • 多维数组的理解
  • 二维数组,多维数组向函数传递参数
    • 二维数组
    • 三维数组

定义

声明行指针的语法:数据类型 (*行指针名)[行的大小]; // 行的大小即数组长度。

int (*p1)[3];  // p1是行指针,用于指向数组长度为3的int型数组。
int (*p2)[5];  // p2行指针,用于指向数组长度为5的int型数组。
double (*p3)[5];  // p3是行指针,用于指向数组长度为5的double型数组。

对二维数组的理解

int bh[2][3] = { {11,12,13},{21,22,23} };

bh是二维数组名,该数组有2两元素,每一个元素本身又是一个数组长度为3的整型数组。
bh被解释为指向:数组长度为3的整型数组类型的行地址组成的 数组指针。
如果存放bh的值,要用数组长度为3的整型数组类型的行指针。

void testlineP() {
	
	int a[3] = { 1,2,3 };
	int* p1 = a;      //注意区分这两写法
	int(*p2)[3] = &a;
	cout << "对一维数组进行遍历" << endl;
	cout << p1 << " " << p1 + 1 << " " << p1 + 2<<endl;
	cout << "遍历不同行" << endl;
	cout << p2 << " " << p2+1 << " " << p2+2 << endl;
}

行指针(对二维数组,多维数组的深层理解)_第1张图片

二维数组名:行地址

void testlineP() {
	
	int a[3] = { 1,2,3 };
	int* p1 = a;      //注意区分这两写法
	int(*p2)[3] = &a;
	cout << "对一维数组进行遍历" << endl;
	cout << p1 << " " << p1 + 1 << " " << p1 + 2<<endl;
	cout << "遍历不同行" << endl;
	cout << p2 << " " << p2+1 << " " << p2+2 << endl;

	//对于二维数组的数组名
	cout << "二维数组的数组名就是行指针" << endl;
	int b[3][3];
	int(*p4)[3] = b;
	cout << p4+1 << endl;
	cout << &b[1][0] << endl;
}

行指针(对二维数组,多维数组的深层理解)_第2张图片

多维数组的理解

int bh[4][2][3];

bh是三维数组名,该数组有4元素,每一个元素本身又是一个2行3列的二维数组。
bh被解释为2行3列的二维数组类型的二维地址。
如果存放bh的值,要用2行3列的二维数组类型的二维指针。

int (*p)[2][3]=bh;

二维数组,多维数组向函数传递参数

二维数组

如果要把bh传给函数(二维数组),函数的声明如下:

void func(int (*p)[3],int len);
//打印二维数组
//使用行指针(指针指向的是一维数组)
//len是说:有多少个行指针
void testlineP2(int(*p)[4],int len) {
	for (int i = 0; i < len; i++) {     //传入行数
		for (int j = 0; j < 4; j++) {   //列数的固定的4
			cout << "p[" << i << "]["<<j<< "] = "<< p[i][j]<<"  \t\t";    //p[i]就是行地址(一维数组的首地址,将他作为一维数组名,后面加上[j]来遍历一维数组)
		}
		cout << endl;
	}
}

main函数如下;

int main()
{
    int a[2][4] = { {1,2,3,4},{5,6,7,8,} };
    testlineP2(&a[0], 2);
    
    return 0;
}

行指针(对二维数组,多维数组的深层理解)_第3张图片

三维数组

//打印三维数组
void testlineP3(int(*p)[2][4],int len) {  

	for (int i = 0; i < len; i++) {     //传入行指针的行数
		for (int j = 0; j < 2; j++) {   //列数的固定的[2][4]
			
			for (int k = 0; k < 4; k++) {
				cout << "p[" << i << "][" << j << "]" << "[" << k << "] = "  << p[i][j][k] << "  \t";    //p[i]就是行地址(一维数组的首地址,将他作为一维数组名,后面加上[j]来遍历一维数组)
			}
			cout << endl;
		}
		cout << endl;
	}
	
}

主函数如下;

int main()
{
    int a[3][2][4] = { { {1,2,3,4},{5,6,7,8,} } ,{ {11,22,33,44},{55,66,77,88,} } ,{ {111,222,333,444},{555,666,777,888,} } };
    testlineP3(&(a[0]), 3);
    
    return 0;
}

行指针(对二维数组,多维数组的深层理解)_第4张图片

你可能感兴趣的:(c++高级,算法,数据结构)