`
bcyy
  • 浏览: 1823317 次
文章分类
社区版块
存档分类
最新评论

C++ 指针 多维数组传递参数

 
阅读更多

数组作为函数参数,其实就是把其第一个元素地址传递给函数。

而多维数组一般都非常困惑我们,解决好多维数组参数传递也有多种实现方法,但是我觉得还是以The C++ Programming Language这本书为标准,看看如何做吧。

C++之父的建议就是不要使用数组传递参数,而是把数组用类包起来,使用STL如:array, string,vector等。如果坚持要直接使用一般数组的话,会要应付各种隐晦的bug和令人困惑的因素。

如下是一般的传递参数方法。但是一般我们并不确定数组的维数,那怎么办呢?

void print_m35(int m[3][5])
{
	for (int i = 0; i!=3; i++) {
	for (int j = 0; j!=5; j++)
	cout << m[i][j] << '\t';
	cout << '\n';
	}
}

第一维是和定位元素(本例中是3)无关的,只是告诉我们有多少个元素(本例中是int[5], 而不是int)在数组里面。

所以可以不确定第一维,如下:

void print_mi5(int m[][5], int dim1)
{
for (int i = 0; i!=dim1; i++) {
for (int j = 0; j!=5; j++)
cout << m[i][j] << '\t';
cout << '\n';
}
}

但是还不能达到我们的要求。我们的本能反应就是如下写程序:

void print_mij(int m[][], int dim1, int dim2) // doesn’t behave as most people would think
{
	for (int i = 0; i!=dim1; i++) {
	for (int j = 0; j!=dim2; j++)
	cout << m[i][j] << '\t'; // surprise!
	cout << '\n';
	}
}

可是这确是错误的。因为m[][]非法,第二维必须让编译器知道,以定位元素。

正确的做法应该是:

void print_mij(int* m, int dim1, int dim2)
{
	for (int i = 0; i!=dim1; i++) {
	for (int j = 0; j!=dim2; j++)
	cout << m[i*dim2+j] << '\t'; // obscure
	cout << '\n';
	}
}

调用函数如下:

int test()
{
	int v[3][5] = {
	{0,1,2,3,4}, {10,11,12,13,14}, {20,21,22,23,24}
	};	
	print_m35(v);
	print_mi5(v,3);
	print_mij(&v[0][0],3,5);
}


最后一个语句也可以只用v[0]代替&v[0][0],因为两者是一样的, 但是不能使用v,这是类型错误了。

最后还是建议用类封装起来,使用vector等容器。

分享到:
评论

相关推荐

    C/C++中多维数组指针作为函数参数传递程序

    在C++中,通过多维数据的指针作为函数参数传递源程序

    C/C++中传递多维数组的各种方法

    C/C++的函数中传递多维数组的各种方法,包括数组和指针的各种用法.

    c++ 第四讲数组与指针

    数组与指针 利用数组表示一组相关 数据项  声明数组、初始化数组、 应用数组中的单个元素  将数组传递给函数  声明和使用多维数组

    一组新的多维数组模板类

    在向函数传递参数的时候,多维数组经常让人感到是麻烦的制造者,通常都是传递首地址 和每一维的大小: void foo(int *,int ,int);; int a[10][10];; foo(&a[0][0],10,10);; //... 十分的麻烦,在函数中...

    C++中用指向数组的指针作函数参数

    多维数组名作为函数参数传递:在二维数组中,数组名a是指向首行a[0]的指针,也就是说a=&a[0]; a[0]是指向首元素a[0][0]的指针,也就是说a[0]=&a[0][0]

    Visual C++开发实战1200例 第3章

    实例097多维数组的指针参数 实例098指针作为函数的返回值 实例099使用函数指针制作菜单管理器, 实例100使用指针实现数据交换, 实例101使用指针实现整数排序 实例102指向结构体变量的指针 实例103周指针实现逆序...

    aybook.cn_c++jiaocheng0105.rar

    第5章 数组和字符串 5.1 一维数组 5.2 字符串 5.3 字符串库函数 5.4 二维数组 5.5 多维数组 5.6 数组初始化 5.7 字符串数组 第6章 指针 6.1 什么是指针 6.2 指针运算符 6.3 指针表达式 6.4 指针和数组 6.5 指针与...

    现代C++程序设计

    6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的类 7.2.1 ...

    C程序设计(第四版)学习辅导【谭浩强】

    7.7.3多维数组名作函数参数198 7.8局部变量和全局变量200 7.8.1局部变量200 7.8.2全局变量201 7.9变量的存储方式和生存期205 7.9.1动态存储方式与静态存储方式205 7.9.2局部变量的存储类别206 7.9.3全局变量的存储...

    非常经典的c++ primer视频教程6-10

    4.4 多维数组 第5章 表达式 5.1 算术操作符 5.2 关系操作符和逻辑操作符 5.3 位操作符 5.3.1 bitset对象或整型值的使用 5.3.2 将移位操作符用于IO 5.4 赋值操作符 5.4.1 赋值操作的右结合性 5.4.2 赋值...

    C语言完全教程

    九、多维数组 十、函数的定义和调用 十一、函数参数的传递和值返回 十二、变量的作用域和存储类型 十三、函数递归 十四、预处理过程 十五、指针概念 十六、数组和指针 十七、指针函数和函数指针 十八、结构体 十九、...

    零起点学通C++多媒体范例教学代码

    14.14 多维数组的初始化 14.15 字符数组 14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的图书链表 15.2.1 图书链表 15.2.2 类的链表 15.3 动态链表 15.3.1 动态链表的建立 15.3.2 ...

    零起点学通C++学习_多媒体范例教学代码

    14.14 多维数组的初始化 14.15 字符数组 14.16 重载数组下标操作符 14.17 总结 第15章 链表 15.1 声明链表结构 15.2 简单的图书链表 15.2.1 图书链表 15.2.2 类的链表 15.3 动态链表 15.3.1 动态链表的...

    【全新正版】现代C++程序设计(原书第2版)

    6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的类 7.2.1 ...

    C程序设计 第四版 谭浩强 高清扫描版 带完整书签目录 加 学习辅导

    7.7.3 多维数组名作函数参数 7.8 局部变量和全局变量 7.8.1 局部变量 7.8.2 全局变量 7.9 变量的存储方式和生存期 7.9.1 动态存储方式与静态存储方式 7.9.2 局部变量的存储类别 7.9.3 全局变量的存储类别 7.9.4 存储...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     4.4 多维数组  小结  术语  第5章 表达式  5.1 算术操作符  5.2 关系操作符和逻辑操作符  5.3 位操作符  5.4 赋值操作符  5.5 自增和自减操作符  5.6 箭头操作符  5.7 条件操作符  5.8 ...

    visualC++2010入门经典源代码

    4.3.4 多维数组的动态分配 171 4.4 使用引用 172 4.4.1 引用的概念 172 4.4.2 声明并初始化lvalue引用 172 4.4.3 声明并初始化rvalue引用 173 4.5 字符串的本地c++库函数 174 4.5.1 查找以空字符结尾的字符串...

    C++Primer中文版(第4版).part4

     4.4 多维数组  小结  术语  第5章 表达式  5.1 算术操作符  5.2 关系操作符和逻辑操作符  5.3 位操作符  5.4 赋值操作符  5.5 自增和自减操作符  5.6 箭头操作符  5.7 条件操作符  5.8 ...

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    4.3.4 多维数组的动态分配 171 4.4 使用引用 172 4.4.1 引用的概念 172 4.4.2 声明并初始化lvalue引用 172 4.4.3 声明并初始化rvalue引用 173 4.5 字符串的本地c++库函数 174 4.5.1 查找以空字符结尾的字符串的长度 ...

    C语言程序设计(高清PDF)

    5.3 多维数组 85 5.4 数组的初始化 85 5.4.1 数组初始化 85 5.4.2 变长数组的初始化 86 5.5 应用程序举例 87 第6章 指针 91 6.1 指针与指针变量 91 6.2 指针变量的定义与引用 92 6.2.1 指针变量的定义 92 6.2.2 指针...

Global site tag (gtag.js) - Google Analytics