声明行指针的语法:数据类型 (*行指针名)[行的大小]; // 行的大小即数组长度。
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;
}
二维数组名:行地址
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;
}
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;
}
//打印三维数组
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;
}