c++ 數組的大小 sizeof


   在確定一個數組大小的時候我們一般用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;
}

  


免責聲明!

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



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