【问题】

定义了一个子函数,传参的内容是一个二维数组



编译提示错误

因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址)

【二维数组的传参】

方法一:形参为二维数组,并给出第二维长度

举例:

#include <stdio.h>

void subfun(int n, char subargs[][5])
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
} void main()
{
char args[][5] = {"abc", "def", "ghi"};
subfun(3, args);
}

方法二:形参作为指向数组的指针并给出数组长度

#include <stdio.h>

void subfun(int n, char (*subargs)[5])
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
} void main()
{
char args[][5] = {"abc", "cde", "ghi"};
subfun(3, args);
}

我用了这个方法:

方法三:形参为指针的指针

实参必须有指针,不能为数组名

#include <stdio.h>

void subfun(int n, char **subargs)
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
} void main()
{
//char* a[3]是一个指针,a[0]存储的是args[0][0]的地址,a[1]存储的是args[1][0]的地址,a[2]存储的是args[2][0]的地址。
char *a[3];
char args[][5] = {"abc", "def", "ghi"};
a[0] = args[0]; //equals with a[0] = &args[0][0];
a[1] = args[1];
a[2] = args[2];
subfun(3, a); //若此处为subfun(3, args);则会编译出错
//a的值是a[0]的地址,所以a = &args[0];
}

上述代码等价于下面代码。

#include <stdio.h>

void subfun(int n, char **subargs)
{
int i;
for (i = 0; i < n; i++) {
printf("subargs[%d] = %s\n", i, subargs[i]);
}
} void main()
{
char *args[] = {"abc", "def", "ghi"};//equals with char *args[3] = {"abc", "def", "ghi"};
subfun(3, args);
}

【总结】二维字符数组的创建和引用的最佳方法

传参,输出:



声明还是这样比较易懂:

上述的第三种方法我还是不太会

【参考资料】

C/C++二维数组传参方法总结 https://blog.csdn.net/gqb_driver/article/details/8886687

【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参的更多相关文章

  1. C语言字符数组和字符串

    用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...

  2. 基于原生JS封装数组原型上的sort方法

    基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...

  3. C语言字符数组超细讲解

    看到标题,有不少朋友会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?莫非它是朵奇葩? 哈哈,确实,一起来认识一下这朵数组界的奇葩吧! 一.字符数组的定义.引用.初始化 大家好!我是字符数组,看我的 ...

  4. Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)

    Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...

  5. Java中字符数组、String类、StringBuffer三者的相互转换

    一.StringBuffer与String的相互转换 1.将StringBuffer转换成String StringBuffer类成员toString函数可将其转换成String类型. StringB ...

  6. 关于数组去重的几种方法-------javascript描述

    第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...

  7. 进制转换( C++字符数组 )

    注: 较为简便的方法是用 整型(int)或浮点型(long.double 注意:该类型不一定能够准确存储数据) 来存放待转换的数值,可直接取余得到每一位数值 较为稳定的方法是用 字符数组储存待转换的数 ...

  8. Delphi的字符串、PChar和字符数组之间的转换

    参考:http://my.oschina.net/kavensu/blog/193719 以下的各种方法都是我在Delphi 6的环境下测试成功的,可能根据你的开发环境.不同的上下文语境……有一些可能 ...

  9. c语言字符数组与字符串的使用详解

    转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...

随机推荐

  1. JAVA学习(六)

    今天先是把内存知识总结归纳地又学习了一遍,现在可以很清楚地描述JVM的内存是如何操作的了. 静态变量储存在方法区内存中,这个之前没有注意到,温故知新了. 如果一个引用是空的(就是指向null),那它在 ...

  2. 深入理解Spring IOC容器及扩展

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  3. 【大爽python算法】递归算法进化之回溯算法(backtracking)

    作者自我介绍:大爽歌, b站小UP主 , python1对1辅导老师, 时常直播编程,直播时免费回答简单问题. 前置知识: 递归算法(recursion algorithm). 我的递归教程: [教程 ...

  4. 【Linux】解压分卷压缩的zip文件

    例如linux.zip.001, linux.zip.002, linux.zip.003. 1. cat linux.zip* > linux.zip #合并为一个zip包. 2. unzip ...

  5. Java_map

    1 package Test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class MapTest { 7 p ...

  6. [gym102412D]The Jump from Height of Self-importance to Height of IQ Level

    考虑使用平衡树维护该序列,操作显然可以用fhq treap的分裂+合并来实现 进一步的,问题即变为维护哪些信息来支持push up的操作(并判定是否存在$a_{i}<a_{j}<a_{k} ...

  7. [loj2462]完美的集合

    当$k$个集合依次为$S_{1},S_{2},...,S_{k}$时,称$x$合法当且仅当: 1.$\forall 1\le i\le k,x\in S_{i}$ 2.$\forall y\in \b ...

  8. 第一章 初始C语言

    第一章 初始C语言 目录 第一章 初始C语言 1. C语言起源 2. 选择C语言的理由 2.1 设计特性 2.2 高效性 2.3 可移植性 2.4 强大而灵活 2.5 面向程序员 3. C语言的应用范 ...

  9. idea 的git代码回退回某个版本

    intellij idea 的git代码回退回滚 找到Reset HEAD 填写提交码,注意这里要选择"hard" 使用命令行强制提交代码 git push -f

  10. 从头带你撸一个Springboot Starter

    我们知道 SpringBoot 提供了很多的 Starter 用于引用各种封装好的功能: 名称 功能 spring-boot-starter-web 支持 Web 开发,包括 Tomcat 和 spr ...