C++给函数传数组参数C++给函数传数组参数

C++给函数传数组参数

在C++中,如果要给一个函数传入一个数组,一般都是传入两个参数一个数组指针和一个数组大小

例:
void print_1 (int n, int *datas )
{
    for (int i = 0; i < n; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

对这个函数,我们可以这样使用它:
const int N = 3;
int datas[N] = {1, 2, 3};
print_1 (N, datas);

不过对这个函数,我们可能会传错 n 的大小,而在运行时可能出错,例如这样使用:
const int N = 3;
int datas[N] = {1, 2, 3};
print_1 (4 , datas);


有些时候,我们希望某函数只接受指定大小的数组,例如我们希望只接受大小为 3 的数组:
void print_2 (int datas[3] )
{
    for (int i = 0; i < 3 ; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

但实际上,上面的函数不能正确工作:
const int N = 3;
int datas[N] = {1, 2, 3};
print_2 (datas);

int datas2[N - 1] = {1, 2};
print_2 (datas2);
 

也就是我们传入了一个大小为 2 的数组,编译器没报任何错误,我们的函数接口 print_2 (int datas[3 ]) 中的 3 没起任何作用


事实上,上面的函数接口应该这样写:
void print_3 (int (&datas) [3])
{
    for (int i = 0; i < 3; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

这时,我们如果这样使用是正确的
const int N = 3;
int datas[N] = {1, 2, 3};
print_3 (datas);

而我们如果这样使用,编译器会报错
int datas2[N - 1] = {1, 2};
print_3 (datas2);


在上面这个例子(print_3)的基础上,我们可以使用模板进行泛型实现
template<int N>
void print_4 (int (&datas)[N])
 
{
    for (int i = 0; i < N; ++i)
    {
        std::cout << datas[i] << " ";
    }
    std::cout << std::endl;
}

这时候,我们可以传递任意大小数组,而不担心给函数传入了错误的参数
const int N = 3;
int datas[N] = {1, 2, 3};
print_4 (datas);

int datas2[N - 1] = {1, 2};
print_4 (datas2);

假如我们给传了错误参数,函数将会报错
const int N = 3;
int datas[N] = {1, 2, 3};
print_4<4 > (datas);

C++中二位数组作为函数参数


变量在作用域里面被声明的是什么类型,就当作什么类型来用。

(1)参数是二维数组,但是要指定第二维的维数。

int array[10][10];

函数声明:void fuc(int a[][10]);

函数调用:fuc(array);

——在函数fuc中,a是二维数组。使用a[i][j]形式来访问数组中元素。

(2)参数使用一维指针数组。

int *array[10];

for(i = 0; i < 10; i++)

    array[i] = new int[10];

函数声明:void fuc(int *a[10]);

函数调用:fuc(array);

——在函数fuc中,a是一维指针数组。使用*(a[i] + j)形式来访问数组中元素。

(3)参数使用指针的指针。

int **array;

array = new int *[10];

for(i = 0; i <10; i++)

    array[i] = new int[10];

函数声明:void fuc(int **a);

函数调用:fuc(array);

——在函数fuc中, a是指针的指针。使用*(int *)(a + i*d2 + j)形式来访问数组中元素。其中:

a[0]<=>array[0][0],

a[1]<=>array[0][1],

a[10]<=>array[1][0]

注:d2为二维数组的二维维数,即列数。并且a + i*d2 + j为地址,所以要把这个类型为指针的指针的地址强制转换为指针来使用

转载自:http://blog.csdn.net/hongjiqin/article/details/5739935 

http://www.cnblogs.com/growup/archive/2011/03/01/1971529.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clover引导mbr安装黑苹果_安装黑苹果记录(一)

从来没有接触过macOS(苹果系统)&#xff0c;孩子说他用的那台电脑linux不能安装一些软件&#xff0c;问我能不能安装黑苹果&#xff0c;一些软件只有win和mac的客户端&#xff0c;却没有linux版本。他知道我不会给他安装Windows&#xff0c;一个是怕他玩游戏&#xff0c;另外一…

人口变动的经济分析

佳木斯市人口变动的经济分析上 人口生产和物质生产&#xff0c;是有史以来人类社会同时存在和同步发展的两种生产&#xff0c;一切经济变动都与人口变动有直接或间接的关系&#xff0c;而一切人口变动又可以从经济变动中找到原因。为此&#xff0c;本文试根据我国、我省和我市第…

【javascript】操作符:一元操作符

一、一元操作符 <script>// var num1,num2,num3; num11;num22; alert(num1num2);//4 在前 alert(num1num2);//4 num11; alert(num1--num2);//3 num1NaN; alert(num1num2);//NaN num1true; alert(num1num2);//3 true转化成了1 num1fal…

doxygen问题集锦

使用doxygen排版数学公式出错的解决方法 参考&#xff1a;http://blog.csdn.net/huangbo10/article/details/46801949 问题 今天玩了一下doxygen&#xff0c;碰到一个问题 ! Undefined control sequence. l.77 $ y_{\mbox{test}} \mathbb{E}[y_{\mbox{train}}] x $ ? !…

ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...

大家好&#xff0c;欢迎来到《刺激实战教室》&#xff0c;我是你们的老朋友刺激哥。俗话说&#xff0c;电子竞技不需要视力&#xff0c;而这句话也是《和平精英》的一个“痛点”。在《和平精英》这款游戏中&#xff0c;更是如此。在很多时候&#xff0c;敌人就藏在我们的附近&a…

[CDA数据分析师学习之路] 【CDA就业班独家发布】学习之路

http://bbs.pinggu.org/thread-4677737-1-1.html转载于:https://blog.51cto.com/xbh1314/1923452

jdk8永久代从方法区移除的验证

/*** 测试使用jdk8中是否仍然可以使用永久代* jvm options * -Xms20m -Xmx20m -Xmn10m -XX:PermSize10m -XX:MaxPermSize10m -XX:PrintGCDetails* * 结果运行提示&#xff1a;* Java HotSpot(TM) Client VM warning: ignoring option PermSize10m; support was removed in 8.0*…

eureka配置_F版本SpringCloud 5—Eureka集群和自我保护机制

源码地址&#xff1a;https://gitee.com/bingqilinpeishenme/Java-Tutorials前言上篇文章中&#xff0c;通过代码搭建了Eureka注册中心和客户端&#xff0c;是Eureka的简单应用&#xff0c;在本文中将会讲解更多关于Eureka服务端的应用以及原理。Eureka 自我保护机制进入自我保…

windows共享内存

在windows编程中避免不了使用共享内存&#xff0c;因为他是进程间通信、文件读取最简单的方式&#xff0c;有书上还说其他进程间通讯机制如管、油槽、WM_COPYDATA底层也是用的共享内存机制。关于使用方法还是请参考MSDN。 最近听说使用共享内存不安全&#xff0c;可能会被其他进…

Chrome指令/追踪Http请求相关

2019独角兽企业重金招聘Python工程师标准>>> Chrome HTTP抓包&#xff0c;在地址栏输入 chrome://net-internals/#requests转载于:https://my.oschina.net/u/2292141/blog/895603

离散卷积与自相关

本文章转载自&#xff1a;http://www.cnblogs.com/einyboy/archive/2012/12/30/2839633.html 一、 定义 离散信号f(n),g(n)的定义如下&#xff1a; N-----为信号f(n)的长度 s(n)----为卷积结果序列,长度为len(f(n))len(g(n))-1 例&#xff1a; f(n) [1 2 3]; g(n) [2 3 1]; …

PHP文件操作类

<?php /*************************************************************************************** 文件名&#xff1a;File.cls.php 文件简介&#xff1a;类clsFile的定义&#xff0c;对文件操作的封装 版本&#xff1a;2.0 最后修改日期&#xff1a;2011-8-23 *******…

excel打开后灰色不显示内容_Excel二维表转换,一分钟就够

点击蓝字关注我们44个Excel 使用技巧基本方法作为职场人&#xff0c;加班累如狗。如何更轻松的工作并获得喜人的报酬便是咱们职场人一直追求的“生活哲理”&#xff0c;说到Excel,对于办公室群体而言实在是太常见不过了&#xff0c;不管做什么&#xff0c;咱们都会跟它打交道&a…

利用PHP SOAP实现web service

一 什么是SOAP&#xff1f;可以做什么&#xff1f; SOAP 指简单对象访问协议&#xff0c;它是一种基于XML的消息通讯格式&#xff0c;用于网络上&#xff0c;不同平台&#xff0c;不同语言的应用程序间的通讯。可自定义&#xff0c;易于扩展。一条 SOAP 消息就是一个普通的 XML…

UVA350-水题

UVA350-水题 #include<iostream>using namespace std;int main() {int c 0;int Z, L, I, M;while (cin >> Z >> I >> M >> L){c;if(Z L && L I && I M && M 0){return 0;}int i 1;int K, P;I I % M;Z Z % M;K …

卷积的循环矩阵求解方法

通常我们求解一维卷积或者二维卷积都是采用模板平移的方法&#xff0c;今天我们介绍一种新的求解方法&#xff0c;可以一次性求出所有的结果。 一维卷积 卷积定义 对于两个长度分别为m和n的序列x(i)和g(i)有&#xff0c; h(i)x(i)∗g(i)∑jx(j)g(i−j)h(i)=x(i)*g(i)=\sum_…

Windows 10 开发日记(五)-- 当Binding遇到异步 -- 解决方案

前文再续&#xff0c;上一章提出了问题&#xff0c;本章提出了三种解决方案&#xff1a; 解决方案一&#xff1a;手动进行异步转换,核心思想:将binding做的事情放入CodeBehind FilterItemControl.XAML: <Grid><Image x:Name"FilterImage" Stretch"Unif…

fseek

int fseek( FILE *stream, long offset, int origin );第一个参数stream为文件指针第二个参数offset为偏移量&#xff0c;正数表示正向偏移&#xff0c;负数表示负向偏移第三个参数origin设定从文件的哪里开始偏移,可能取值为&#xff1a;SEEK_CUR、 SEEK_END 或 SEEK_SETSEEK_…

static_cast, dynamic_cast, const_cast探讨【转】

首先回顾一下C类型转换&#xff1a; C类型转换分为&#xff1a;隐式类型转换和显式类型转换 第1部分. 隐式类型转换又称为“标准转换”&#xff0c;包括以下几种情况&#xff1a;1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类…

RANSAC算法注记

今天学习了一下RANSAC随机样本一致性算法&#xff0c;其在图像融合、特征点匹配方面有很强大的应用。网上已经有很多人写了关于这方面的文档&#xff0c;就不再造轮子了。特此罗列出来&#xff0c;以供后续参考。 我的数学之美&#xff08;一&#xff09;——RANSAC算法详解 …