C++ 函數和數組

來看看一個函數聲明:

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()函數仍傳遞了一個值,這個值揹負給了一個新變量,但是這個值是一個地址,而不是數組的內容。

                                                     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章