前言
区分一下指针数组和数组指针和二维数组做参数该怎么传递。。
指针数组和数组指针区分 在中间加个“的”即可理解,指针的数组 数组的指针
一、指针数组
指针数组,指针的数组。表示一个数组里面装的全是指针。
定义:int *p[5]; // []的优先级高于 **,先和p结合为数组,再由int *指明为指针
不能进行p++操作,因为p是数组头,是一个地址 而不是指针!!
例子:
#include <iostream>
using namespace std;
int main()
{
int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
int *p1[5];
for (int i = 0; i < 5; i++)
{
p1[i] = a[i];//单独给数组里面的每个指针赋值
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
//以下三种形式都可以!
//cout << p1[i][j] << " ";
//cout << *(p1[i] + j)<< " ";
cout << *(*(p1 + i) + j) << " ";
}
cout << endl;
}
}
结果:
二、数组指针
数组指针,数组的指针。即为只想数组的指针,又称为行指针,只想一行数组的指针。
定义:int (*p)[3];//()的优先级最高,先指明p是一个指针,再指向一个大小为3的一维数组。
p++ 的意思是指向下一行数组。
例子:
#include <iostream>
using namespace std;
int main()
{
int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
int(*p2)[3];
p2 = a;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
cout << (*p2)[j] << " ";
}
p2++;
cout << endl;
}
}
结果:
三、二维数组做参数传递
1.就用二维数组但是要表明行或者列
#include <iostream>
using namespace std;
void test(int aaa[][3])
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
cout << aaa[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
test(a);
}
2. 用数组指针 (行指针)
#include <iostream>
using namespace std;
void test(int (*aaa)[3],int m)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < 3; j++)
{
cout << (*aaa)[j] << " ";
}
aaa++;
cout << endl;
}
}
int main()
{
int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
test(a,5);
}
3. 用指针数组
#include <iostream>
using namespace std;
void test(int *aaa[5])
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
cout << aaa[i][j] << " ";
//cout << *(aaa[i]+j) << " ";
//cout << *(*(aaa+i) + j) << " ";
}
cout << endl;
}
}
int main()
{
int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
int* aa[5];
for (int i = 0; i < 5; i++)
{
aa[i] = a[i];
}
test(aa);
}
4.用二维指针
#include <iostream>
using namespace std;
void test(int** aaa, int m, int n)//二维指针
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
//强制转换二维指针为一维,因为数组他的内存本身就是连续的!
cout << *((int*)aaa + i * n + j) << " ";
//cout << *(*(aaa+i) + j) << " ";//是错误的!因为aaa这个时候已经由数组退化为指针了,不知道数组的大小啦!
}
cout << endl;
}
}
int main()
{
int a[][3] = { {1,12,3},{4,5,6},{7,8},{9,10},{11} };//3*5*4
test((int**)a,5,3);
}