C语言中二维数组作为函数参数来传递的三种方法

c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:

方法一, 形参给出第二维的长度。

例如:

#include <stdio.h>
void func(int n, char str[ ][5] )
{
 int i;
 for(i = 0; i < n; i++)
 printf("/nstr[%d] = %s/n", i, str[i]);
}

void main()
{
 char* p[3];
 char str[][5] = {"abc","def","ghi"};
 func(3, str);
}

方法二,形参声明为指向数组的指针。

例如:

#include <stdio.h>
void func(int n, char (*str)[5] )
{
 int i;
 for(i = 0; i < n; i++)
 printf("/nstr[%d] = %s/n", i, str[i]);
}

void main()
{
 char* p[3];
 char str[][5] = {"abc","def","ghi"};
 func(3, str);
}

方法三,形参声明为指针的指针。

例如:

#include <stdio.h>
void func(int n, char **str)
{
 int i;
 for(i = 0; i < n; i++)
 printf("/nstr[%d] = %s/n", i, str[i]);
}
void main()
{
 char* p[3];
 char str[][5] = {"abc","def","ghi"};
 p[0] = &str[0][0];
 p[1] = str[1];
 p[2] = str[2];
 func(3, p);

}

附加,第三种传参方式说明:在函数中使用传参过来的二维数组(指针)进行数组取值的时候不能使用(array[i][j] )这种形式来取值。应该将二维数组看成一个一维数组,使用array[i * j + j]这种形式来进行取值。

个人理解:这是因为在传参的时候,我们将array[][]数组当成二级指针来进行传递,所以我认为他是将数组的属性退化成了二级指针的属性,因此这里并不能使用array[i][j]这种方式来进行数组取值。输出格式如下

int tag = 0;//tag标记,在方法中输出二维数组时所需要的标记
printf("使用传递过来的二维数组参数输出二维数组\n");
 for(i = 0; i < rows*columns; i++) {
  printf("%d,", array[i]);
  if(tag == columns-1) {
   tag = 0;
   printf("\n");
  } else {
   tag++;
  }
 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • C语言二维数组中的查找的实例

    C语言二维数组中的查找的实例 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路描述:一个数字的下方和右方是比它本身大的区域,而左方和上方时比它本身小的区域.选取右上角的数字进行比较,当该数大于指定的数时,舍去该列,当该数小于指定的数时,舍去该行,当相等时,则表示找到 C语言实现: #include<stdio.h> #include<stdlib.h>

  • C语言二维数组的处理实例

    复制代码 代码如下: char finalPathSet[256][256]; char middlePathSet[256][256]; int finalSetSize=0; int middleSetSize=0; int addToPathSet(char path[]){    strcpy(middlePathSet[middleSetSize],path);    middleSetSize++;}int meetPathSet(){    char tempPathSet[256

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

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

  • C语言中二维数组指针的简要说明

    C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了.例如对于一个二维数组 a[2][4]={{1,2.3},{4,5,6}} a+i,&a[i],*(a+i),a[i], 这四个表达式到底表示什么呢? 先告诉答案吧,其实这几个表达式都是指向同一个地址的,也许你会很诧异,也会很疑惑,怎么会是这样呢!!事实证明就是这样的, C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,

  • C语言二维数组几种常用的表示方法

    名称:二维数组的几种表示方法 说明:常用的有以下几种二维数组的表示方法: (1).第一种是普通的二维数组的表示方法. (2).第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要简单些,只要不用进行地址转换. (3).第三种表示是用指针数组.本例中的c[i]中的元素其实是地址.这种方法对各个元素大小不一样的情况下比较适用.如:假定有若干个不等长字符串需要我们处理,如果使用a [i ][j]结构,则j必

  • 直观理解C语言中指向一位数组与二维数组的指针

    一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

  • 举例理解C语言二维数组的指针指向问题

    之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多.所以当我尝试用二级指针去访问二维数组时,就经常会出错.下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]

  • C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n", i, str[i]); } void main() { char* p[3]; char str[][5] = {"abc&quo

  • React将组件作为参数进行传递的3种方法实例

    目录 前言 方式一:直接传递 jsx 创建好的元素 方式二:直接传递组件本身 方式三:传递一个返回组件的函数 三种方案的对比 总结 前言 在日常的开发中,开发通用组件的机会其实并不多,尤其是在各种组件库已经遍地都是的情况下.而作为一个通用组件库的使用者,经常会看到把 React 组件作为参数传递下去的场景,每当这个时候,其实或多或少都会有一些疑问,比如:有些组件传递下去的是组件名,而有些组件传递下去的是一个箭头函数返回一个组件,而有些直接传递一个 jsx 创建好的元素,这些传递方案的适用场景如何

  • C语言之把数组名作函数参数的四种情况说明

    目录 把数组名作函数参数的四种情况 思路 实参与形参的对应关系有以下四种情况 我们来看代码 一般函数作参数和数组名作参数区别 一般函数作参数 数组名作函数参数 把数组名作函数参数的四种情况 如果想要通过函数调用得到n个要改变的值 思路 ①在主函数中设n个变量,用n个指针变量指向它们 ②设计一个函数,有n个指针形参,在这个函数中改变这n个形参所指向的值 ③在主函数中调用这个函数,在调用时将n个指针变量做为实参,将它们的地址传给该函数的形参 ④在执行该函数的过程中,通过形参指针变量,改变它们所指向的

  • python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这里,简要介绍一下判别数据接收接收完成常用的三种方法: 1.基础数据接收法: 使用基础数据接收法时,当与服务socket断开连接时,会接收到空字符串.因此,可以根据此特点,在程序中加入循环,一直接收数据,直到数据发送端关闭socket连接.适用场景:客户端和服务器的链接为短链接(即一次socket通讯

  • 详解C++编程中用数组名作函数参数的方法

    C++数组的概念 概括地说:数组是有序数据的集合.要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标.数组名和下标惟一地标识一个数组中的一个元素. 数组是有类型属性的.同一数组中的每一个元素都必须属于同一数据类型.一个数组在内存中占一片连续的存储单元.如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图所示. 引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系.许多好的算法都与

  • C语言之关于二维数组在函数中的调用问题

    目录 关于二维数组在函数中的调用问题 函数调用二维数组 二维数组如何放到函数中使用 下面以一个二维矩阵的转置为例 关于二维数组在函数中的调用问题 之前在学习二维数组的时候感觉理解起来很简单,所以理解一下就过去了,但是当自己真正的去用二维数组数组解决一些问题(特别是在函数调用二维数组的过程中)才真正发现原来使用起来还是要去注意一些细节的.废话不多说,直接上干货! 函数调用二维数组 在函数中调用二维数组的具体格式如下: 1.声明:这是声明的两种格式,在这里定义的是一个N*5的二维字符数组,各位看官一

  • C语言多维数组数据结构的实现详解

    目录 数据结构之多维数组 各基本操作函数原型说明 各基本操作的具体实现 测试分析 思考与小结 1. 对数组的再认识 2.调试过程中遇到的问题及解决方案 3.算法的时间复杂度分析 总结 数据结构之多维数组 定义结构体 typedef struct { ElemType* base;//数组元素基址(数组基址) int dim;//数组维数 int* bounds;//数组维界基址(存放各位长度信息) int* constants;//数组映象函数常量基址 }Array; 各基本操作函数原型说明 (

  • shell 使用数组作为函数参数的方法(详解)

    因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bash function showArr(){ arr=$1 for i in ${arr[*]}; do echo $i done } regions=("GZ" "SH" "BJ") showArr $regions exit 0 把代码保存为test.sh后执行,只输出了第一个元素. ./t

随机推荐