數組作為函數參數進行傳遞


今天編程序時發生了個這樣的錯誤:

在頭文件里 定義了一個數組:

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



在學習這個知識點時是有一些感想的,雖說C++ Primer已經看了一遍,里面的知識點也認真地消化過,但是一到用的時候就使不上勁。看來應該在看書的同時多實踐書上的代碼,這樣才能對代碼的應用有更好的理解。

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM