在確定一個數組大小的時候我們一般用sizeof
int arr1[] = {1 , 2, 4 ,5}; int arr1_len = sizeof arr1/sizeof(int); std::cout<< "arr1 len: " << arr1_len << std::endl;
但是如果數組是函數的一個參數,我們就要把數組的大小也做為參數傳入,換個方式說就是,如果數組做為參數,在函數內我們就不能使用sizeof來計算數組的大小?例:
int sum(int arr[], int len)
參數int arr[] 中括號為空表明可以傳入任意長度的數組給函數。但是參數arr[]並不是數組,而是一個指針,但我們可以當作數組來使用。
一般情況下,數組名就是指針,c++將數組名解析為第一個元素的地址:
arr == &arr[0]
但也有例外,第一種:數組聲明使用數組名來標記存儲位置;第二種:對數組名使用sizeof將得到整個數組的長度(以字節為單位)
上面的方法 int sum(int arr[], int len)中 arr是數組名,也就是第一個元素的地址,因此函數傳遞的是地址 也就是一個int指針。所以函數等價於:
int sum(int *arr, int len)
我在main之上聲明的函數 int sum(int arr[], int len); 定義我們用 int sum(int *arr, int len) 也是合法的
#include<iostream> int sum(int arr[], int len); int main() { int int_arr[] = {1, 2, 3}; int int_arr_len = sizeof int_arr/sizeof(int); auto total = sum(int_arr, int_arr_len); std::cout << "total: " << total << std::endl; } int sum(int arr[], int len) { int total = 0; for (int i = 0; i < len; i++) total += arr[i]; return total; } // 上面和下面是一樣,兩個同不能同時存在 int sum(int *arr, int len) { int total = 0; for (int i = 0; i < len; i++) total += arr[i]; return total; }
上面使用int *arr 替換了 int arr[] 都是正確的,在c++中,只有在函數頭或函數原型中 int arr[]和 int *arr的含義是相同的。他意味着 arr是一個int 指針,不過數組表示法 int arr[]提醒用戶, arr 不僅指向int,還指向int數組的第一個int。
arr做為函數參數,並沒有把數組內容傳遞給函數,面是將數組的地址和類型(int)告訴了函數。所以在函數內使用sizeof是得不到正確的數組大小的。
int sum(int arr[], int len); int main() { int arr[] = {1, 2, 3, 4, 5}; std::cout << "sizeof: " << sizeof arr << std::endl; int arr_size = sizeof arr/ sizeof(int); sum(arr, arr_size); return 0; } int sum(int arr[], int len) { int total = 0; std::cout << "sizeof: " << sizeof arr << std::endl; for (int i = 0; i < len; i++) total += arr[i]; return total; }