数组作为函数参数进行传递

今天编程序时发生了个这样的错误:

在头文件里 定义了一个数组:

View Code
1 char s[]="1234567890";

又定义了一个现显示组的函数:

View Code
1 void Display(char* c);

通过下面这两条语句分别在现实函数和主函数中现实数组的大小:

View Code
1     sizeof(c);
2     sizeof(s);

现实结果却大相径庭,在主函数中为11,在现实函数中却为4。

经过思考发现,在主函数中s代表的是一个数组,而在现实函数中c代表的是一个指向数组头的指针。数组的大小为11,指针的大小为4。

主程序如下:

View Code
复制代码
 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 }
复制代码

现实结果:

我的问题是怎样可以在主函数和子函数中都指的是数组而不是一个指向数组头的指针???

 

 

在网上查了几种将数组作为函数参数进行传递的方法,列举如下:

View Code
复制代码
 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发现书上已经明确指出没有实现这种想法的方法,数组的长度必须在函数中作为参数进行传递。


另外由于第五种方法需要重新定义向量模版,和主题不符,所以在主函数里并没有调用它。例程中给的程序如下所示:

View Code
1 vector<int> verc1(a,a+10);
2 vector<int> verc2(b,b+8);
3 PutArray5(verc1);
4 PutArray5(verc2);

 上面这五种调用数组的方法只是在传递数组的方式上不同,可以归纳为传递数组的一种方法,即:传递指向数组头的指针和数组的长度。另外一种传递数组的方法是将指向数组头的指针和指向数组尾的指针作为两个参数进行传递,函数定义如下:

View Code
1 int sum_arr(const int* begin,const int* end);


  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 数组作为函数参数传递有两种方式。一种是将整个数组作为函数的参数,即将数组名称传入函数中。另一种是将数组中的某个元素作为函数的参数,即将数组中的参数传入函数中。当数组名作为函数实参传递时,函数定义处的数组类型形参可以指定长度也可以不指定长度。而当数组元素作为函数实参传递时,数组元素的类型必须与形参的数据类型一致。在C语言中,可以通过将数组名和数组的长度作为实际参数传递给形式参数来实现数组作为函数参数传递。在函数中,可以通过数组名来遍历数组,改变数组中的元素。 #### 引用[.reference_title] - *1* [C语言中数组作为参数传递](https://blog.csdn.net/weixin_42072280/article/details/84439400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C语言数组在函数中的传参](https://blog.csdn.net/qq_48458789/article/details/115220671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值