数组作为函数参数进行传递
今天编程序时发生了个这样的错误:
在头文件里 定义了一个数组:
1 char s[]="1234567890";
又定义了一个现显示组的函数:
1 void Display(char* c);
通过下面这两条语句分别在现实函数和主函数中现实数组的大小:
1 sizeof(c);2 sizeof(s);
现实结果却大相径庭,在主函数中为11,在现实函数中却为4。
经过思考发现,在主函数中s代表的是一个数组,而在现实函数中c代表的是一个指向数组头的指针。数组的大小为11,指针的大小为4。
主程序如下:
1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 char s[]="1234567890"; 6 void Display(char* c); 7 8 void main() 9 {10 char a;11 cout<<"这个是在主函数中对数组长度的测试:"<<sizeof(s)<<endl;12 Display(s);13 cin>>a;14 }15 16 17 void Display(char* c)18 {19 cout<<"这个是在子函数中对数组长度的测试:"<<sizeof(c)<<endl;20 }
现实结果:
我的问题是怎样可以在主函数和子函数中都指的是数组而不是一个指向数组头的指针???
在网上查了几种将数组作为函数参数进行传递的方法,列举如下:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<vector> 4 using namespace std; 5 6 char s[]="1234567890"; 7 int a[10]={0,1}; 8 int b[10]={0,1}; 9 void Display(char* c);10 void PutArray1(int *p,int length1);11 void PutArray2(int p[],int length1);12 void PutArray3(int p[10]);13 void PutArray4(int (&p)[10]);14 void PutArray5(vector<int>verc);15 16 void main()17 {18 char q;19 cout<<"这个是在主函数中对数组长度的测试:"<<sizeof(s)<<endl;20 Display(s);21 cout<<"*********************************************"<<endl;22 PutArray1(a,10);23 PutArray2(a,10);24 PutArray3(a);25 PutArray4(b);26 cin>>q;27 }28 29 30 void Display(char* c)31 {32 cout<<"这个是在子函数中对数组长度的测试:"<<sizeof(c)<<endl;33 }34 void PutArray1(int *p,int length1)35 {36 int length2=sizeof(p);37 cout<<"第一种方法的输出:"<<endl;38 cout<<"第一种方法数组的长度为:"<<length2<<endl;39 for(int i=0;i<length1;i++)40 {41 cout<<p[i];42 }43 cout<<endl;44 }45 void PutArray2(int p[],int length1)46 {47 int length2=sizeof(p);48 cout<<"第二种方法的输出:"<<endl;49 cout<<"第二种方法数组的长度为:"<<length2<<endl;50 for(int i=0;i<length1;i++)51 {52 cout<<p[i];53 }54 cout<<endl;55 }56 void PutArray3(int p[10])57 {58 int length2=sizeof(p);59 cout<<"第三种方法的输出:"<<endl;60 cout<<"第三种方法数组的长度为:"<<length2<<endl;61 for(int i=0;i<9;i++)62 {63 cout<<p[i];64 }65 cout<<endl;66 }67 void PutArray4(int (&p)[10])68 {69 int length2=sizeof(p);70 cout<<"第四种方法的输出:"<<endl;71 cout<<"第四种方法数组的长度为:"<<length2<<endl;72 for(int i=0;i<9;i++)73 {74 cout<<p[i];75 }76 cout<<endl;77 }78 void PutArray5(vector<int>verc)79 {80 vector<int>::iterator begin_iter=verc.begin();81 vector<int>::iterator end_iter=verc.end();82 int size=verc.size();83 cout<<"第五种方法的输出:"<<endl;84 cout<<"第五种方法数组的长度为:"<<size<<endl;85 cout<<"下面这种方法是采用向量遍历的方法遍历数组:"<<endl;86 for(vector<int>::iterator iter=begin_iter;iter!=end_iter;iter++)87 {88 cout<<*iter;89 }90 cout<<endl;91 cout<<"下面这种方法是采用普通遍历数组的方法遍历数组:"<<endl;92 for(int i=0;i<size-1;i++)93 {94 cout<<verc[i];95 }96 cout<<endl;97 }
在这里,int *arr和int arr[]的含义相同,编译器自动将 int arr[]替换为int *arr,所以这也解释了上面在主函数和子函数中利用数组名求数组长度会得到不同结果的原因。这种情况只有在数组作为函数参数进行传递时才会发生(C++ Primer Plus,P192)。
其中第四种方法没有理解,疑问暂时留在这里吧。
另外虽然上面四种方法都可以正确地在子函数中传递数组作为参数,但是仍然不能满足博客刚开始的要求:在子函数中可以测的参数数组的长度。后来查看C++ Primer Plus发现书上已经明确指出没有实现这种想法的方法,数组的长度必须在函数中作为参数进行传递。
另外由于第五种方法需要重新定义向量模版,和主题不符,所以在主函数里并没有调用它。例程中给的程序如下所示:
1 vector<int> verc1(a,a+10);2 vector<int> verc2(b,b+8);3 PutArray5(verc1);4 PutArray5(verc2);
上面这五种调用数组的方法只是在传递数组的方式上不同,可以归纳为传递数组的一种方法,即:传递指向数组头的指针和数组的长度。另外一种传递数组的方法是将指向数组头的指针和指向数组尾的指针作为两个参数进行传递,函数定义如下:
1 int sum_arr(const int* begin,const int* end);
在学习这个知识点时是有一些感想的,虽说C++ Primer已经看了一遍,里面的知识点也认真地消化过,但是一到用的时候就使不上劲。看来应该在看书的同时多实践书上的代码,这样才能对代码的应用有更好的理解。
转载于:https://www.cnblogs.com/tziyachi/archive/2012/02/11/2347073.html
数组作为函数参数进行传递相关推荐
- 一维数组和二位数组作为函数参数进行传递的方式
数组作为参数形式进行传递其实是指针作为函数参数的一种具体表现形式, 才得以在函数中改变原来的数值,函数结束后,任然生效 普通变量作为函数参数实现是数值传递,而指针变量作为函数参数传递实现的是地址的传递 ...
- java二维数组如何传参_C语言中二维数组作为函数参数来传递的三种方法
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include void func(int n, char str[ ][5] ) { i ...
- C语言中将二维数组作为函数参数来传递
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char ...
- 二维数组作为函数参数的传递
自己试着摸索的,会尝试int**做形参,没学过很难知道问题所在 错误示例 void f(int** p){; }int main(){int a[10][10];f(a); } 正确示例 void f ...
- 二维数组作为函数参数的用法(c++)
背景 今天刷题的时候遇到了需要一个大小可变的二维数组作为函数参数进行传递的情况,有点模糊不清,所以查了一些资料,写了这篇博客. 大小固定的二维数组 正确写法如下: void Func(int arra ...
- shell 使用数组作为函数参数的方法
使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bashfunction showArr(){arr=$1for ...
- ajax参数中字符串最大长度_6.7 C++数组名作函数参数 | 求3*4矩阵中最大的值
C++用数组元素作函数实参 C++中实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与用变量作实参一样,将数组元素的值传送给形参变量. C++也可以用数组名作函数参 ...
- C语言多维数组做函数参数技术推演
多维数组做函数参数技术 C语言中只会以机械式的值拷贝的方式传递参数(实参把值传给形参) 二维数组参数同样存在退化的问题 等价关系 C语言中只会以机械式的值拷贝的方式传递参数(实参把值传给形参) int ...
- C语言中数组做函数参数的问题
数组做函数参数,会退化成为一个指针变量.因此在进行数组参数传递的同时,需要传递一个数组长度的参数变量. 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到.关于这个sizeof ...
最新文章
- Play自动生成的项目目录简介
- android RadioGroup设置某一个被选中
- 有不含有重复数字的数组构造二叉树_Leetcode刷题记录:构建最大数二叉树
- Python编程基础:第三十六节 模块Modules
- 程序猿的英语之ielts indicator speaking test
- EOS从入门到精通-设计背景与DPOS算法(文字稿)
- 美国用户现在可以下载其所有Apple帐户数据,这是操作方法
- 拥抱.NET Core系列:依赖注入(2)
- mysqldump 忽略视图_Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)...
- 幼儿园调查过程怎么写_幼儿园对孩子的重要性你真的清楚吗?
- App设计之路——WebApp浅谈
- poll函数_Windows 上有 poll 函数吗?
- paip.提升用户体验与安全性----cookie盗用检测
- Windows下的发包工具xcap
- 风车IM即时通讯聊天系统源码
- endnoteX9英文参考文献格式下载和导入
- 系统架构设计师三次考试分享
- 2012年最具影响力路由器配置精品文章荟萃【108篇】
- 【TFLearn和TensorFlow应用】——泰坦尼克号预测
- Go 中的那些语法糖
热门文章
- JXOI2018做题笔记
- 使用node来搭建简单的后台业务
- IntelliJ中的main函数、for循环、System.out.println()快捷键
- Linux 将文件夹下的所有文件复制到另一个文件里
- php动态修改配置文件
- 存储过程参数输入输出
- 字符串移位:如“abcdefghi”右移2位后变成“cdefghiab”
- 使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录
- 使用JDOM解析XML
- Win64 驱动内核编程-26.强制结束进程