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

将数组作为实参传递

 
阅读更多

在C++中我们应该少用指针,多用引用,原因请大家自行搜索。在传递数组的时候我们需要格外注意,先让我们看一个简单的范例。

// PassArray.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

template <typename T>
void Func1(T, T);
template <typename T>
void Func2(T&, T&);
void Func3(int (&)[10], int (&)[12]);

int _tmain(int argc, _TCHAR* argv[])
{
    int a[10], b[12];

    Func1(a, b);
    Func2(a, b);
    Func3(a, b);

    return 0;
}

template <typename T>
void Func1(T, T)
{
    cout<<"Func1.invoked!"<<endl;
}
template <typename T>
void Func2(T&, T&)
{
    cout<<"Func2.invoked!"<<endl;
}
void Func3(int (&m)[10], int (&n)[12])
{
    cout<<"Func3.invoked!"<<endl;
}

首先这个范例无法编译通过:

error C2782

error C2782: 'void __cdecl Func2(T &,T &)' : template parameter 'T' is ambiguous
could be 'int [12]'
or 'int [10]'

原因就出在类型推断上。根据定义,Func2的类型必须是T&,也就是说传递实参的时候,两个形参必须是相同的,而这一点在模板编程中就会由编译器来负责推断。

Func1:

调用Func1(a, b)则推断的类型分别是Func1(int*, int*),调用函数将会自动将数组的首地址指针作为实参进行传递,因此类型推断两形参相同,编译通过!

Func2:

调用Func2(a, b)因为我们希望按引用的方式进行实参传递,因此需要遵循这样的规律:

(P208)如果形参是数组的引用,编译器将不会将数组实参转化为指针,而是传递数组引用的本身。在这种情况下,数组大小成为形参和实参类型的一部分。

所以推断类型分别是Func2(int (&)[10], int (&)[12]),因为int (&)[10] != int (&)[12],所以与T == T相悖!自然也就编译不过了!

Func3:

该函数是Func2的一个静态表示,通过上面的解释应该很容易理解这个代码了。

另:形参用字符指针,而实参是字符数组,这时候会发生什么?待解。

分享到:
评论

相关推荐

    VB 数组参数调用实例.rar

     Call Merage(A1(), B1(), C1()) '调用合并过程,三个数组做实参  For i = 0 To UBound(C1)  Picture3.Print C1(i); '打印数组  If (i 1) Mod 10 = 0 Then Picture3.Print '换行  Next i  End Sub

    C#中用foreach语句遍历数组及将数组作为参数的用法

    主要介绍了C#中用foreach语句遍历数组及将数组作为参数的用法,C#的数组可作为实参传递给方法形参,需要的朋友可以参考下

    c++将数组名作为函数参数对数组元素进行相应的运算

    (1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按...

    PHP数组传递是值传递而非引用传递概念纠正

    在调用函数时通过将PHP数组作为实参赋给形参,在函数中修改,并不会影响到数组本身,说明此过程中的传递为值传递,数组变量并非是指向此数组本身的引用,感兴趣的朋友可以了解下,或许对你有所帮助

    值传递,指针传递,引用传递的区别,内含可运行代码和详细解释

    另一方面,值传递由于形参和实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用值传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...

    C语言地址传递与值传递

    在C语言中,所有非数组形式的数据实参都是以值传递的形式调用,本文就对C语言地址传递与值传递进行了简单介绍。

    1操作系统实践报告.doc

    操作系统实践报告 多进程题目 sh1.c: 实现shell程序,要求具备如下功能 支持... cd 同样是根据输入并拆分成数组后判断出是cd命令后,fork一个新的进程,然后调用 chdir并将拆分数组的参数部分传递给chdir作为实参即可

    老生常谈C++中实参形参的传递问题

    这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项: 1.非引用形参 这是最普通,也是最简单的形参传递了。 参数传递,即是使用实参副本(注意啊...

    C/C++语言二维数组的传参方法总结

    C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三种方法总结如下(GCC验证成功):  方法一:形参为二维数组并给定第二维长度  此方法是简单直观的方法,...

    为方法传递对象参数&对象数组.pptx

    理解对象作为实参时函数调用的原理; 理解并掌握Java中参数传递方式—值传递 掌握对象数组的创建,理解对象数组元素中的值 掌握对象数组的使用 了解不可变对象和类的概念 ;给方法传递一个对象,是将对象的引用传递给...

    C++语言程序设计自测练习

    若用数组名作为函数调用的实参,传递给形参的是( )。 A. 数组的首地址 B. 数组中第一个元素的值 C. 数组全部元素的值 D. 数组元素的个数 4. 以下错误的描述是( )。 A. 被调用函数中可以不用return语句 B. ...

    C++中指针指向二维数组实例详解

    那么ary[4]相当于int(*aryp),以下理解如此,但参数传递需要知道实参所在 的一维个数,所以传递的时候应该传递多一个参数,子数组的引用可以理解 为(*p),那么取元素就是(*p)[i],如下 void printVal(int(*aryp)[5]...

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

    6.1.2 函数指针作为实参 249 6.1.3 函数指针的数组 250 6.2 初始化函数形参 250 6.3 异常 252 6.3.1 抛出异常 253 6.3.2 捕获异常 254 6.3.3 mfc中的异常处理 255 6.4 处理内存分配错误 256 6.5 函数重载 257 6.5.1 ...

    javascript入门笔记

    Javascript Basic 1、Javascript 概述(了解) ... 调用函数时,所传递的参数列表,称之为"实参(实际参数)" 3、练习 1、定义一个函数 change ,该函数中接收两个参数(a,b) 2、在函数体中,如果 a 大于 b的话...

    【JavaScript源代码】JavaScript中arguments的使用方法详解.docx

    JavaScript中arguments的使用方法详解  js这是一门弱语言,不像其他语言如c,java等,有严格的规范, 所以...而没有传递值的命名参数将会被自动赋予undefined; 如下图: (如果要获取到其他的不是实参的属性,就

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

    7.7.1数组元素作函数实参193 7.7.2数组名作函数参数195 7.7.3多维数组名作函数参数198 7.8局部变量和全局变量200 7.8.1局部变量200 7.8.2全局变量201 7.9变量的存储方式和生存期205 7.9.1动态存储方式与静态存储方式...

    C语言程序设计标准教程

    在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的标识符都为n, 但这是两个不同的量,各自的作用域不同)。 在主函数中用printf 语句输出一次n值,这个n值是实参n的...

    C语言程序设计(谭浩强)第三版

     7.7.1数组元素作函数实参  7.7.2数组名作函数参数  7.7.3多维数组名作函数参数  7.8局部变量和全局变量  7.8.1局部变量  7.8.2全局变量  7.9变量的存储方式和生存期  7.9.1动态存储方式与静态存储方式  ...

    新概念C语言.李一波(带详细书签).pdf

    “新概念C语言”突破了以往任何一种语言教材的旧的模式,将教学内容分为入门篇和提高篇两个篇章。在入门篇中只引进程序设计必要的语法现象,达到快速入门。激发兴趣的目的。在入门篇和提高篇之间插一个强化上机实验...

    函数传参分析

    函数传参时,程序运行时会给形参独立申请一块空间,...如果要对调用函数的局部变量的值进行修改,就必须把变量的地址当做实参传递给被调用函数,被调函数通过地址间接修改变量的值。 此ppt用几个实例证实了一下这个观点

Global site tag (gtag.js) - Google Analytics