c++之所以强大,其中重要原因之一就是支持指针,然而这也是c++最令人头痛的问题之一,其中二维数组作为参数传递就是其中之一。
一、关于一维数组
C++中一维数组作为函数参数传递应用十分普遍,原理和操作都十分简单。数组名就代表了数组的首地址,下标就是偏移量。函数的形式参数声明为一级指针即可(Type *),而实参就是数组名。
二、扩展到二维数组
一维的情况解决了,接下来扩充到二维的情形。思路同前,采用二级指针引用二维数组(Type**)从而得到如下程序:
#include "stdafx.h"
#include<iostream>
using namespace std;
void test(int m[][15],int i,int j){
for(int a=0;a<i;a++){
for(int b=0;b<j;b++){
m[a][b] = b;
}
}
}
int print(int m[][15],int i,int j){
for(int a=0;a<i;a++){
for(int b=0;b<j;b++){
cout<<m[a][b]<<",";
}
cout<<endl;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int m[15][15],i,j;
i = 15;j = 15;
test(m,i,j);
print(m,i,j);
return 0;
}
|
|
|
可是对左边的程序进行编译却会报告错误:
错误 1 error C2664: “test”:
不能将参数 1
从“int [15][15]”
转换为“int **”
呵呵,问题来了吧,不能将这个二维数组转化而二级指针。好,既然这样,那我就把形参声明为二维数组而不是二级指针。对左边函数声明修改如下:
void test(int **m,int i,int j)
改为:
void test(int m[][],int i,int j)
可是这样一来有出现了新的问题:
不能将参数 1
从“int [15][15]”
转换为“int [][1]
原来数组大小匹配不了,于是很容易想到将地二维大小明确给出,而不是缺省值。
void test(int m[][15],int i,int j)
OK
搞定!
|
|
上面的解决方案虽然解决了燃眉之急,但毕竟不优雅,因为作为函数你必须保证声明了足够大的空间,但是究竟多大才是安全的呢?谁也不知道。下面的解决方案就优雅得多了
#include "stdafx.h"
#include<iostream>
using namespace std;
void test(int **m,int i,int j){
for(int a=0;a<i;a++){
for(int b=0;b<j;b++){
m[a][b] = b;
}
}
}
int print(int **m,int i,int j){
for(int a=0;a<i;a++){
for(int b=0;b<j;b++){
cout<<m[a][b]<<",";
}
cout<<endl;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int **m,i,j;
i = 15;j = 15;
m = new int*[i];
for(int c=0;c<i;c++)
m[c] = new int[j];
test(m,i,j);
print(m,i,j);
return 0;
}
|
|
分享到:
相关推荐
c#调用c++DLL,DLL里是二维数组 ,c#里如何调用二维数组
实现数组的行列互换 形参使用二维数组。函数调用使用引用传递,比较基础。
注意:函数模板maxMin中要处理二维数组A的m行n列的诸元素,但设计第一参数传递过来的是Type*类型的首元素指针,所以具体处理时可以按照如下的“一维数组”方式来进行(共处理m乘以n个数据 -- 也即二维数组A的m行n列...
第一种方式是直接传递二维数组,但是必须标明第二维的值,因为如果只是传递a[][],编译器无法分配这样的数组,所以要这样传int a[][3] 第二种方法是传递指针数组方式,即int (*a)[3] 第三种是传递指针方法。 具体...
将二维数组传递给本函数,本函数会将数组显示为图像。注意数组传递前需先转换为char型。 图像显示是windows编程的基础,本程序可作为一个子函数用于调用,可同时显示多张图像。
资源代码演示的是c#代码调用c++ DLL 的方式。该演示为原创,绝非搬砖。解决了c# 调用 C++ Dll获取相关信息之如何传递结构体数组引用以及如何处理获取到的结构体数组数据的问题。
C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三种方法总结如下(GCC验证成功): 方法一:形参为二维数组并给定第二维长度 此方法是简单直观的方法,...
C++中指针指向二维数组实例详解 一维指针通常用指针表示,其指向的地址是数组第一元素所在的内存地址,如下 int ary[4][5]; int(*aryp)[5] = ary; 那么ary[4]相当于int(*aryp),以下理解如此,但参数传递需要知道...
输入5个学生,4门课成绩,二维数组stu[5][4]表示,行标表示学生,列标表示课程成绩,分别编写函数aver()、fals()和well()完成:(1)求第一门课的平均分;(2)统计有2门以上课程不及格的同学人数;(3)平均成绩在90分...
一维指针其实就相当于一维数组,不用去看书上所说的数组在内存中的首地址这些晦涩的话,以此类推 二维指针就相当于二维数组,新手对一维数组的开辟与释放比较容易熟悉,例如上面的a 释放就是 delete []a;...
1.掌握函数的定义和使用方法;掌握函数调用的方法;掌握函数参数传递的机制;...2.熟练掌握一维数组和二维数组的定义、引用和初始化;掌握字符数组与字符串的关系以及字符串变量的表示,熟练字符串处理函数的应用。
我们都知道在 C++ 中分配动态数组用的是 new , 撤销动态数组用的是 delete[ ] ,现在让我们来看看怎么利用这两个关键字给二维指针分配内存
如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,...
├─15_15_day3_二维数组.mp4 ├─16_16_day3_字符数组.mp4 ├─17_17_day4_指针的传递.mp4 ├─18_18_day4_指针的偏移使用.mp4 ├─19_19_day4_指针传递与偏移的应用.mp4 ├─20_20_day4_数组指针与二维数组.mp4 ├...
多维数组名作为函数参数传递:在二维数组中,数组名a是指向首行a[0]的指针,也就是说a=&a[0]; a[0]是指向首元素a[0][0]的指针,也就是说a[0]=&a[0][0]
二维数组的巧妙用法:将二维数组的第一位数组名作为实际参数传递给了形式参数。由此可进一步理解二维数组是若干个一位数组所组成的概念。
6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的类 7.2.1 入门实例:自定义日期类 7.2.2 第一个C++类:...
实例105输出二维数组任一行任一列值 实例106使用指针查找数列中的最大值和最小值 实例107用指针数组构造字符串数组 实例108将若干字符串按照字母顺序输出 实例109用指向函数的指针比较大小 实例110用指针函数实现求...
6.6.2 白雪公主:利用二维数组来存储姓名 6.7 利用数据文件对数组赋值 6.8 总结 6.9 练习 复习题 第7章 类和对象 7.1 我们所了解的类和对象 7.2 编写自己的类 7.2.1 入门实例:自定义日期类 7.2.2 第一个C++类:Date...