问题描述
- 三种传参,操纵二维数组
-
利用三种不同的方式在函数参数中,传递二维数组:void func(int **a,int m,int n); 利用二级指针
void func(int *a[],int m,int n); 利用一维指针数组
void func(int a[][10],int m,int n); 利用二维数组请问:那种方式可以在函数func中通过参数a操纵传递进的二维数组?如果不能,原因是什么?
解决方案
下面这俩是等价的:
void func(int **a,int m,int n);
void func(int *a[],int m,int n);
不管你是 int **a
还是 int *a[]
,编译器把a都当作“指向指针的指针”,也就是你说的二级指针。这里如果你直接 a[1][6]
这样访问是没意义的,编译器根本不知道你每行每列的偏移嘛。
但如果你用void func(int a[][10],int m,int n);
,这就让编译器明确地知道:a是一个“'指向10元素int数组的指针'数组”,a[1][6]
是可以成功访问的。
写个代码测下就明白了:
#include <iostream>
using namespace std;
/*
void func(int **a,int m,int n)
{
cout << a[m][n] << endl; // 编译报错
}
void func(int *a[],int m,int n)
{
cout << a[m][n] << endl; // 编译报错
}
*/
void func(int a[][10],int m,int n)
{
cout << a[m][n] << endl; // 编译通过,输出6
}
int main()
{
int a[2][10];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 10; j++)
{
a[i][j] = i + j;
}
}
func(a, 1, 5);
return 0;
}
解决方案二:
如果参数是a,则是
void func(int a[][10],int m,int n); 利用二维数组
因为a是对数组首元素取地址,**a和*a[]都是指针,首元素地址和指针不是一个概念,数组名a只是个常量(一个值为数组首元素地址的常量),不能进行++或者--运算
解决方案三:
三个函数都是可以的。
解决方案四:
数组怎么传,都会转为指针传递,都可以操作数组元素
解决方案五:
二级指针也可以使用,但是你得自己做地址操作,而不能直接用数组后缀
这种情况下,你可以动态指定数组维数
时间: 2024-08-02 21:18:33