【问题】

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



编译提示错误

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

【二维数组的传参】

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

举例:

  1. #include <stdio.h>
  2. void subfun(int n, char subargs[][5])
  3. {
  4. int i;
  5. for (i = 0; i < n; i++) {
  6. printf("subargs[%d] = %s\n", i, subargs[i]);
  7. }
  8. }
  9. void main()
  10. {
  11. char args[][5] = {"abc", "def", "ghi"};
  12. subfun(3, args);
  13. }

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

  1. #include <stdio.h>
  2. void subfun(int n, char (*subargs)[5])
  3. {
  4. int i;
  5. for (i = 0; i < n; i++) {
  6. printf("subargs[%d] = %s\n", i, subargs[i]);
  7. }
  8. }
  9. void main()
  10. {
  11. char args[][5] = {"abc", "cde", "ghi"};
  12. subfun(3, args);
  13. }

我用了这个方法:

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

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

  1. #include <stdio.h>
  2. void subfun(int n, char **subargs)
  3. {
  4. int i;
  5. for (i = 0; i < n; i++) {
  6. printf("subargs[%d] = %s\n", i, subargs[i]);
  7. }
  8. }
  9. void main()
  10. {
  11. //char* a[3]是一个指针,a[0]存储的是args[0][0]的地址,a[1]存储的是args[1][0]的地址,a[2]存储的是args[2][0]的地址。
  12. char *a[3];
  13. char args[][5] = {"abc", "def", "ghi"};
  14. a[0] = args[0]; //equals with a[0] = &args[0][0];
  15. a[1] = args[1];
  16. a[2] = args[2];
  17. subfun(3, a); //若此处为subfun(3, args);则会编译出错
  18. //a的值是a[0]的地址,所以a = &args[0];
  19. }

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

  1. #include <stdio.h>
  2. void subfun(int n, char **subargs)
  3. {
  4. int i;
  5. for (i = 0; i < n; i++) {
  6. printf("subargs[%d] = %s\n", i, subargs[i]);
  7. }
  8. }
  9. void main()
  10. {
  11. char *args[] = {"abc", "def", "ghi"};//equals with char *args[3] = {"abc", "def", "ghi"};
  12. subfun(3, args);
  13. }

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

传参,输出:



声明还是这样比较易懂:

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

【参考资料】

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. 本地以sysdba 身份登录数据库实例时,报错ORA-01031 权限不足

    在linux 操作系统的数据库服务器上,使用"sqlplus / as sysdba" 登录Oracle 10.2 数据库实例时,登录失败,显示ORA-01031:  权限不足. ...

  2. Python基础(数据类型与变量、字符串和编码)

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- # name = 200 # if name > 100: # print(name,'大于100' ...

  3. ES6—数值(Number,Math对象)(复习+学习)

    ES6-数值(Number,Math对象)(复习+学习) 每天一学,今天要学习ES6的关于数的扩展以及复习,然后通过看书,查阅资料,以及webAPI来搞清楚遇到的,没见过的对象方法等等,下面为本次学习 ...

  4. Java 关键字之 final

    欢迎学习 Java 基础文章系列之 final 关键字 final 代表什么意思? final 通常是指无法被改变或者不能被改变的,什么情况下不想被改变呢? 不想改变可能有两种原因:设计或者效率. 在 ...

  5. python爬取ip地址

    ip查询,异步get请求 分析接口,请求接口响应json 发现可以data中获取 result.json()['data'][0]['location'] # _*_ coding : utf-8 _ ...

  6. 力扣 - 剑指 Offer 22. 链表中倒数第k个节点

    题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...

  7. 麒麟Linux上编译subversion

    麒麟Linux上编译subversion svn-1.7不支持svn info --show-item=revision[1]获取revision. svn-1.12开始不能保存密码stackover ...

  8. [Aizu2993]Invariant Tree

    若$(i,j)\in E$,实际上会不断推出$(p_{i},p_{j})\in E,(p_{p_{i}},p_{p_{j}})\in E,...$ 考虑将$i$向$p_{i}$连边得到了一张(由若干个 ...

  9. [hdu6761]Minimun Index

    $lyndon\ word$(以下简写为Lw):对于一个字符串s,其为Lw当且仅当其的最小后缀为自身 性质:若$u<v$为LW,那么$uv$也为Lw(反证法即可证) $lyndon$分解:将一个 ...

  10. Error occurred during initialization of VM Could not reserve enough space fo

    通过es的elasticsearch.bat 启动.发现错误:Error occurred during initialization of VM Could not reserve enough s ...