數組作為函數形式參數的使用學習


<<C++ Primer>> 第四版中Exercise Section 7.2.5 中有習題7.13如下:編寫程序計算數組元素之和。

首先,數組作為形式參數有兩種,第一種是引用形式,第二種是非引用形式。

引用形式:參數傳遞時帶上了數組的大小,這樣只能傳遞進大小一樣的數組。

非引用形式:參數傳遞時沒有帶上數組大小,這樣會導致在編譯時,只要傳遞的是相類型的指針,那么編譯都是可以通過的。

針對非引用形式的數組形參傳遞,數組會被轉換為指向第一個元素的指針,復制這個指針的值並用來初始化形參。因此下面三個形式的形參聲明其實是一樣的,形參類型都是 int*

int fun(int *p)

int fun(int p[])

int fun(int p[10])

 

看下面的例子:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues(int arr[10])
{
    for (size_t i = 0; i < 10; ++i)
    {
        cout << arr[i] << endl;
    }
}

int main()
{
    int i[2] = {1,2};
    int *p = 0;
    int pc[] = {0,1,2,3,4,5,6,7,8,9};
    printValues(pc);
    printValues(i);
    printValues(p);
    return 0;
}

 

 

代碼全部被編譯通過,但是當執行時,結果會變成這樣:

 

這里只要是int 型的指針傳遞進函數printvalues,編譯都通過了,但是程序運行時,卻拋出異常。

 

再來看引用參數的傳遞:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues2(int(&arr)[10])
{
    for (size_t i = 0; i < 10; ++i)
    {
        cout << arr[i] << endl;
    }
}
int main()
{
    int i[2] = {1,2};
    int *p = 0;
    int pc[] = {0,1,2,3,4,5,6,7,8,9};
    printValues2(pc);
    printValues2(i);
    printValues2(p);
    return 0;
}

這里代碼:

printValues2(i); 編譯提示錯誤:

printValues2(p);編譯提示錯誤:



注釋掉這兩行后,程序編譯通過,運行成功,打印出pc 數組的各個值。

較為常見的是傳遞非引用數組類型的作為參數。這樣做有一個關鍵點就是如何確
保程序能夠處理數組范圍之內的數據。書上列舉出了三種方式:

1
在數組末尾放置一個標識符,用來標識數組末尾。類似的情況就像C風格字符串。
2 使用標准庫方式,傳入數組第一個元素的指針和最后一個元素的指針。
3 顯式傳遞數組大小。

先看第一種方式:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues_01(int *p)
{
    while (*p)
    {
        cout << *p++ << endl;
    }
}
int main()
{
    int temp = 0;
    int i[3] = {1,2,NULL};
    int *p = &temp;
    int pc[] = {1,2,3,4,5,6,7,8,9,NULL};
    printValues_01(pc);
    return 0;
}

 

打印出的結果為:


第二種方式為:

#include "stdafx.h"
#include <iostream>
using namespace std;
void printValues_02(const int* begin,const int* end)
{
    while (begin!=end)
    {
        cout << *begin++ << endl;
    }
}
int main()
{
    int temp = 0;
    int i[3] = {1,2,NULL};
    int *p = &temp;
    int pc[] = {1,2,3,4,5,6,7,8,9,NULL};
    printValues_02(pc,pc+10);
    return 0;
}

第三種方式多加一個參數即可。

 







 

 
 

 

 

 


免責聲明!

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



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