参数-三种传参,操纵二维数组

问题描述

三种传参,操纵二维数组

利用三种不同的方式在函数参数中,传递二维数组:

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

参数-三种传参,操纵二维数组的相关文章

C语言中:二维数组能否作为函数参数,如何定义?

问题描述 C语言中:二维数组能否作为函数参数,如何定义? 二维数组能否作为函数的参数进行单独的定义和使用?将?个二维数组的行和列交换,存储到另外一个数组中去,该如何定义函数实现呢? 解决方案 C语言中,数据名做函数的参数后,会退化为指针.没有必要使用指向指针的指针,使用指针就可以了:另外,将是几维数组.和每一维的大小也做为参数传入函数就可以的. 解决方案二: 可以作为函数参数传,但一般不这样做,一般传的是 指向该二维数组的指针~ 解决方案三: 二维数组作为函数参数(C语言)C/C++ 二维数组作

C语言数组入门之数组的声明与二维数组的模拟_C 语言

语言中指针与数组这两个概念之间的联系是密不可分的,以至于如果不能理解一个概念,就无法彻底理解另一个概念. C语言中的数组值得注意的地方有以下两点: C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来.然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组.这样,要"仿真"出一个多维数组就不是一件难事. 对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针.其他有关数组的操作,哪怕它们看上去是以数组下标进行运算的,

c语言中怎么把一个大小不确定的二维数组当作参数传入函数中

问题描述 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中,取大神,取大神,取大神 解决方案 用VC++新建一个程序,默认生成的main函数定义如下 int mian(int argc, char* args[]) 这就是一个例子. 解决方案二: 一个表示长度的参数,一个指向二维数组的指针 解决方案三: fun(args[][],int rows,int cols) 解决方案四: void Func(int array[][10]

二维数组传参单层指针的问题

问题描述 二维数组传参单层指针的问题 问题: 本人想写一个函数用来给二维数组赋值,函数原型如下: void Input(uchar row, uchar line, double *array) { uchar count; for(count=0; count<(row*line); count++) scanf("%1f", array+count); } 将1~9数字赋值给数组之后发现数组里的内容为: 不知道为什么,求指教! 解决方案 scanf,输入需要变量的地址,而 a

[总结]C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: 1 #include <cstdio> 2 void print(int *a[3]) 3 { 4 printf("%d\n",a[0][0]); 5 } 6 7 int main() 8 { 9 int a[2][3] = {1,2,3,4,5,6}; 10 print(a); 11 return 0

JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素 数组的格式 //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无返回值 main方法 数组 public static void main(String[] str) { /** * 格式:元素类型

js二维数组定义和初始化的三种方法总结_javascript技巧

方法一:直接定义并且初始化,这种遇到数量少的情况可以用 var _TheArray = [["0-1","0-2"],["1-1","1-2"],["2-1","2-2"]] 方法二:未知长度的二维数组 var tArray = new Array(); //先声明一维 for(var k=0;k<i;k++){ //一维长度为i,i为变量,可以根据实际情况改变 tArray[k]

《C语言及程序设计》实践参考——二维数组当函数参数

返回:贺老师课程教学链接 [项目1-二维数组当函数参数]定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: int sum(int array[ ][4],int m,int n); //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. #include <stdio.h> int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和 int main() { int

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|