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

article/2025/9/14 21:15:29

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

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

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);



http://chatgpt.dhexx.cn/article/ERs7MFlG.shtml

相关文章

C++关于数组作为函数参数的值传递和指针传递

明确&#xff1a; 数组作为函数参数和普通的参数是有区别的&#xff1b; 函数中普通的参数 如同void insert(int a,int b)之类的传递分为3种方式传递 值传递指针传递&#xff0c;指针值的传递&#xff0c;引用传递&#xff0c;它们的参数的传递是将实参的值赋给形参。 而数…

详谈C++中数组作为函数参数

一、一个例子引发的思考 运行以下代码&#xff0c;请问输出是什么&#xff1f;例子来源于《剑指Offer》&#xff0c;我对书上例子做了修改&#xff0c;让其可以运行。 #include<iostream> using namespace std;int GetSize(int data[]) {return sizeof(data); } int mai…

易懂的数组作为函数参数(C语言)

易懂的数组作为函数参数&#xff08;C语言&#xff09; 目录 易懂的数组作为函数参数&#xff08;C语言&#xff09;1、数组做函数参数2、通过形参数组修改数组元素3、数组排序 1、数组做函数参数 &#xff08;1&#xff09;、若将一个数组作为实际参数传递给函数&#xff0c;…

以数组作为函数参数的函数调用

调用有参函数时需要提供实参&#xff0c;实参可以是常量&#xff0c;变量或者表达式&#xff0c;数组元素就相当于变量&#xff0c;因此数组元素可以用作函数实参&#xff0c;但是不能用作函数形参&#xff08;因为在函数被调用时临时分配存储单元&#xff0c;不可能为一个数组…

数组作为函数参数传递

数组作为函数参数传递 数组作为函数参数传递时&#xff0c;传入的是数组首地址&#xff0c;并非数组本身。今天总算理解了这一点。写了一个打印数组元素的函数&#xff0c;代码如下&#xff1a; void print1(int arr[]) {int len sizeof(arr) / sizeof(arr[0]);cout <<…

C++之数组作为函数参数

好消息&#xff0c;好消息&#xff0c;数组也可当参数啦&#xff01;&#xff01;&#xff01; 长这样&#xff0c; void arr(int a[])还挺好看&#xff08;生平第一次夸代码/狗头/&#xff09; 众所周知&#xff0c;变量可以当参数&#xff0c;但是数组当参数的话只能被认为…

C语言 数组作为函数参数

1、数组元素作为函数实参 int a[10]; //相当于定义了10个变量&#xff0c;a[0]~a[9]&#xff0c;那么数组元素就是&#xff1a;a[0]~a[9]&#xff0c;数组元素就可以当成变量使用。 #include<stdio.h> //函数声明 int whichmax(int x,int y); int main() {int a[10];a[1…

数组元素作为函数参数

数组元素作为函数参数 数组元素作为函数参数数组元素作函数实参数组名作为函数参数 数组元素作为函数参数 数组可以作为函数的参数使用&#xff0c;进行数据传送。数组用作函数参数有两种形式&#xff0c;一种是把数组元素(下标变量)作为实参使用&#xff1b;另一种是把数组名…

将数组作为函数参数调用

数组与单个元素一样&#xff0c;也可以作为参数被函数调用&#xff0c;但其用法与单个元素调用存在不同。 对于单个元素调用&#xff0c;如不使用引用&或者指针&#xff0c;则在函数中对形参的操作不会反映到实参上&#xff0c;即实参不会发生改变&#xff0c;具体用法详见…

零基础入门学习C语言008讲:函数(4)

8.&#xff17;数组作为函数参数 数组可以作为函数的参数使用&#xff0c;进行数据传送。数组用作函数参数有两种形式。 一种是把数组元素(下标变量)作为实参使用&#xff1b; 另一种是把数组名作为函数的形参和实参使用。 8.7.1 数组元素作函数实参 数组元素就是下标变量…

数组做函数的参数

&#xff11; 一维数组做参数 数组作为函数的参数&#xff0c;是指以数组名作为实际参数传递给函数。用数组名做函数参数时&#xff0c;不是进行直接的值传递&#xff0c;而是地址的传送&#xff0c;也就是把实参数组的首地址赋予形参数组名。 比如&#xff0c;下面声明了一个…

顺序表的基本操作代码实现

顺序的基本操作代码实现&#xff08;初始化、插入、删除、销毁等等&#xff09; 1.标头.h #pragma once #include<stdio.h> #include<stdlib.h> /*author:W.yuData:2020-04-27 */#define INITSIZE 10 //定义顺序表的初始最大长度typedef struct {int* data; //顺…

数据结构实验报告:顺序表基本操作的实现

1、实验目的 &#xff08;1&#xff09;领会线性表顺序存储结构的特点。 &#xff08;2&#xff09;掌握线性表顺序存储结构的常见算法。 2、实验具体要求 &#xff08;1&#xff09;建立顺序表存储数据序列&#xff08;10&#xff0c;20&#xff0c;30&#xff0c;40&…

顺序表基本操作的实现

实验一 顺序表基本操作的实现 一、实验学时&#xff1a; 2学时 二、实验目的 实现顺序表的基本操作 三、实验内容 顺序表的建立、取指定元素、返回指定元素位置顺序表中插入新元素、删除指定元素操作的实现 四、主要仪器设备及耗材 硬件&#xff1a;计算机一台软件&…

数据结构学习笔记——顺序表的基本操作(超详细最终版+++)建议反复看看ヾ(≧▽≦*)o

目录 前言一、顺序表的相关知识点二、顺序表的定义三、顺序表的初始化四、顺序表的建立五、顺序表的输出六、顺序表的逆序输出七、顺序表的插入操作八、顺序表的删除操作九、顺序表的按位和按值查找基本操作的完整代码十*、顺序表删除的常用操作十一*、顺序表的常用合并操作 前…

数据结构:顺序表的基本操作

线性表的顺序存储顺序表的线性存储示意图C语言定义线性表的顺序存储结构顺序表的基本操作顺序表的基础操作完整代码 线性表的顺序存储 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素&#xff0c;使得线性表在逻辑结构上相邻的元素存储在连续的物…

顺序表的基本操作(C语言)

1.要求 编程实现顺序表的基本操作&#xff0c;并设计一个菜单调用。 ①建立&#xff08;初始化&#xff09;、遍历、取值、查找、插入、删除 ②判空、求元素个数、前驱、后继、置为空表、销毁 2.分析 我们需要去定义一个结构体&#xff08;以下代码的结构体名为SqList),其…

C语言实现顺序表基本操作

1.顺序表初始化 2.顺序表创建 3.求顺序表的长度 4.判断顺序表是否为空 5.向顺序表中插入元素 6.删除顺序表中元素 7.将顺序表翻转 8.将顺序表降序排序 #include<stdio.h> #define MAXSIZE 100//定义顺序表的最大存储个数 typedef struct SqList {int *base;int l…

顺序表基本操作

文章目录 1. 顺序表插入元素2. 顺序表删除元素3. 顺序表查找元素4. 顺序表更改元素 1. 顺序表插入元素 向顺序表中插入数据元素&#xff0c;根据插入位置的不同&#xff0c;可分为以下 3 种情况&#xff1a; 插入到顺序表的表头&#xff1b;在表的中间位置插入元素&#xff1…

顺序表的基本操作

一、实验目的&#xff1a; 1、复习C语言程序设计中的知识。 2、掌握线性表的顺序存储结构的表示和实现方法。 3、掌握顺序表基本操作的算法实现。 二、实验内容&#xff1a; 1&#xff0e;建立顺序表。 2&#xff0e;在顺序表上实现插入、删除和查找等操作。 三、实验要求…