【C/C++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参
【问题】
定义了一个子函数,传参的内容是一个二维数组

编译提示错误
因为多维数组作为形参传入时,必须声明除第一位维外的确定值,否则系统无法编译(算不出偏移地址)
【二维数组的传参】
方法一:形参为二维数组,并给出第二维长度
举例:
#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++】二维数组的传参的方法/二维字符数组的声明,使用,输入,传参的更多相关文章
- C语言字符数组和字符串
用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...
- 基于原生JS封装数组原型上的sort方法
基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...
- C语言字符数组超细讲解
看到标题,有不少朋友会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?莫非它是朵奇葩? 哈哈,确实,一起来认识一下这朵数组界的奇葩吧! 一.字符数组的定义.引用.初始化 大家好!我是字符数组,看我的 ...
- Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...
- Java中字符数组、String类、StringBuffer三者的相互转换
一.StringBuffer与String的相互转换 1.将StringBuffer转换成String StringBuffer类成员toString函数可将其转换成String类型. StringB ...
- 关于数组去重的几种方法-------javascript描述
第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...
- 进制转换( C++字符数组 )
注: 较为简便的方法是用 整型(int)或浮点型(long.double 注意:该类型不一定能够准确存储数据) 来存放待转换的数值,可直接取余得到每一位数值 较为稳定的方法是用 字符数组储存待转换的数 ...
- Delphi的字符串、PChar和字符数组之间的转换
参考:http://my.oschina.net/kavensu/blog/193719 以下的各种方法都是我在Delphi 6的环境下测试成功的,可能根据你的开发环境.不同的上下文语境……有一些可能 ...
- c语言字符数组与字符串的使用详解
转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...
随机推荐
- JAVA学习(六)
今天先是把内存知识总结归纳地又学习了一遍,现在可以很清楚地描述JVM的内存是如何操作的了. 静态变量储存在方法区内存中,这个之前没有注意到,温故知新了. 如果一个引用是空的(就是指向null),那它在 ...
- 深入理解Spring IOC容器及扩展
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- 【大爽python算法】递归算法进化之回溯算法(backtracking)
作者自我介绍:大爽歌, b站小UP主 , python1对1辅导老师, 时常直播编程,直播时免费回答简单问题. 前置知识: 递归算法(recursion algorithm). 我的递归教程: [教程 ...
- 【Linux】解压分卷压缩的zip文件
例如linux.zip.001, linux.zip.002, linux.zip.003. 1. cat linux.zip* > linux.zip #合并为一个zip包. 2. unzip ...
- Java_map
1 package Test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class MapTest { 7 p ...
- [gym102412D]The Jump from Height of Self-importance to Height of IQ Level
考虑使用平衡树维护该序列,操作显然可以用fhq treap的分裂+合并来实现 进一步的,问题即变为维护哪些信息来支持push up的操作(并判定是否存在$a_{i}<a_{j}<a_{k} ...
- [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 ...
- 第一章 初始C语言
第一章 初始C语言 目录 第一章 初始C语言 1. C语言起源 2. 选择C语言的理由 2.1 设计特性 2.2 高效性 2.3 可移植性 2.4 强大而灵活 2.5 面向程序员 3. C语言的应用范 ...
- idea 的git代码回退回某个版本
intellij idea 的git代码回退回滚 找到Reset HEAD 填写提交码,注意这里要选择"hard" 使用命令行强制提交代码 git push -f
- 从头带你撸一个Springboot Starter
我们知道 SpringBoot 提供了很多的 Starter 用于引用各种封装好的功能: 名称 功能 spring-boot-starter-web 支持 Web 开发,包括 Tomcat 和 spr ...