数组指针和指针数组
在二维数组传参时,经常遇到这样的问题,不能将”int ** “转换为”int (*)[5]“,虽然二维数组a[5][5]的a是二级指针,但是用int **是单纯的二级指针,但是二维数组的a是完全不同的。a[0]表示第一行一维数组,a[1]表示第二行二维数组,a是具有结构的,这一点和普通的二级指针具有很大的区别。
数组指针
int (*p)[5]是数组指针,又称为行指针。为了方便记忆,数组指针可以想成是“二维数组要用到的指针“好了。
指针p指向一个由5个元素组成的整形数组指针。
p+1相对于p的位置移动了5个元素的内存单位。
int a[5][5], (*p)[5] = a;
如此一来就将p这个数组指针指向了二维数组的a.
指针数组
char *p[5],就是说p[0],…,p[4]都是指向一个char型的指针。一般来说,这样的就是一个存储了不同长度的字符串数组罢了。
比如:char *name[]={“Monday”,”Tuesday”,…}
二维数组传参时要注意的问题
一维传参
形参:
int maxA(int a[], int n)
int maxB(int *a, int n)
以上两种写法是一样的,没有任何区别。
实参:
int a[10],*p;
p = a;
maxA(a,10)和maxB(p,10)是一样的。
原因很简单,传入的只是个地址,还有并且还有类型,以便编译器寻址用。对于一维数组,上面两种写法是一样的。
二维传参
int a[2][3]和int a[][3]是等价的,但最多只能省略第一维的大小,不能省略其他维,因为实参传过来的只是数组的初始地址,不说明列参数,则无法确定在第几个元素开始“换行”,即无法确定数组在内存中的位置。
//二维数组传参问题示例
//二维数组传参问题示例
#include<iostream>
using namespace std;
//方法1:传递数组,注意第二维必须标明
void fun1(int arr[][3], int iRows)
{
for (int i = 0; i<iRows; i++)
{
for (int j = 0; j<3; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
//方法二:一重指针,这种方法和第一种其实是一样的,只是写法不同而已。
void fun2(int(*arr)[3], int iRows)
{
for (int i = 0; i<iRows; i++)
{
for (int j = 0; j<3; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
//方法三:指针传递,不管是几维数组都把他看成是指针,
void fun3(int*arr, int iRows, int iCols)
{
for (int i = 0; i<iRows; i++)
{
for (int j = 0; j<iCols; j++)
{
cout << *(arr + i*iCols + j) << " ";
}
cout << endl;
}
cout << endl;
}
//方法4:利用二级指针。不过内部不能直接写arr[i][j],因为这样不能正确寻址,要模拟编译器寻址。
void fun4(int**arr, int iRows, int iCols)
{
for (int i = 0; i < iRows; i++)
{
for (int j = 0; j < iCols; j++)
{
cout << *((int*)arr + i*iCols + j) << " ";
}
cout << endl;
}
cout << endl;
}
int main()
{
int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
int k[2][3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
cout << "fun1" << endl;
fun1(a, 2);
cout << endl;
cout << "fun2" << endl;
fun2(a, 2);
cout << endl;
//此处必须进行强制类型转换
//所以必须强制转换成指针,如果a是一维数组则不必进行强制类型转换
cout << "fun4" << endl;
fun4((int**)a, 2,3);
//此处必须进行强制类型转换
//所以必须强制转换成指针,如果a是一维数组则不必进行强制类型转换
cout << "fun3" << endl;
fun3((int*)a, 2, 3);
cout << "fun3" << endl;
fun3((int*)k, 3, 3);
cout << endl;
}