來看看一個函數聲明:
int sum_arr(int arr[], int n) //arr = array name, n = size
防護括號指出arr[ ]是一個數組,而方括號爲空則表明,可以將任何長度的數組傳遞給該函數。但是實際情況並非如此:arr實際上並不是數組,而是一個指針!但是在編寫函數其餘部分時,可以將arr看作是數組。首先來看一個例子:
#include<iostream>
const int ArSize = 8;
int sum_arr(int arr[], int n);
int main()
{
int cookies[ArSize] = { 1, 2, 4, 8, 16, 32, 64, 128 };
int sum = sum_arr(cookies, ArSize);
std::cout << "Total cookies eaten: " << sum << "\n";
system("pause");
return 0;
}
int sum_arr(int arr[], int n)
{
int total = 0;
for (int i = 0; i < n; i++)
{
total += arr[i];
}
return total;
}
1. 函數如何使用指針來處理數組
在一般情況下,將數組名視爲指針,將數組名解釋爲第一個元素的地址:
cookies = &cookies[0] //array name is address of first element
上述程序執行下面的函數調用:
int sum = sum_arr(cookies,ArSize);
其中,cookies是數組名,cookies是其第一個元素的地址,因此函數傳遞的是地址。由於數組的元素的類型爲int,因此cookies的類型必須是int指針,即int*。這表明函數頭應該是這樣:
int sum = sum_arr(int * arr, int n) //array = array name, n = size
其中用int * arr替換了int arr [ ]。這證明了這兩個函數頭是正確的,在C++中,當用於函數頭或函數原型中,int *arr和int arr[ ]的含義才相同,在其他上下文中,int * arr和int arr[ ]的含義並不相同。無論arr是指針還是數組名,表達式arr[3]都指數組的第四個元素,就目前而言,記住下面的兩個恆等式:
arr[i] == *(ar + i); //value in two natations
&arr[i] == ar+i; //address in two natations
切記,將指針(包括數組名)加1,實際上是加了一個與指針指向的類型的長度(以字節爲單位)相等的值。
2. 將數組作爲參數意味着什麼
函數調用sum_arr(cookies,AeSize)將cookies數組第一個元素的地址和數組中的元素在數目傳遞給sum_arr()函數將cookies的地址賦給指針變量arr,將ArSize賦給int變量n。這意味着程序並沒有將數組內容傳遞給函數,而是將數組的地址、包含的元素種類以及元素數目提交給函數。有了這些信息之後,函數便可以使用原來的數組,傳遞常規變量時,函數將使用該變量的拷貝;但傳遞數組時,函數將使用原來的數組。實際上,這種區別並不違背C++按值傳遞的方法,sum_arr()函數仍傳遞了一個值,這個值揹負給了一個新變量,但是這個值是一個地址,而不是數組的內容。