簡體   English   中英

你如何獲得傳遞給 function 的數組的大小?

[英]How do you get the size of array that is passed into the function?

我正在嘗試編寫一個 function 來打印出數組中的元素。 但是,當我使用傳遞的 arrays 時,我不知道如何遍歷數組。

void
print_array(int* b)
{
  int sizeof_b = sizeof(b) / sizeof(b[0]);
  int i;
  for (i = 0; i < sizeof_b; i++)
    {
      printf("%d", b[i]);
    }
}

迭代傳遞的數組的最佳方法是什么?

您還需要將數組的大小傳遞給函數。
當您將數組傳遞給函數時,您實際上是在傳遞該數組中第一個元素的地址。 所以指針只指向函數內部的第一個元素。

由於數組中的內存是連續的,您仍然可以使用指針算法,例如(b+1)指向第二個元素或等效地b[1]

void print_array(int* b, int num_elements)
{
  for (int i = 0; i < num_elements; i++)
    {
      printf("%d", b[i]);
    }
}

這個技巧只適用於數組而不是指針:

sizeof(b) / sizeof(b[0])

...和數組與指針不同

為什么不為此(C++)使用函數模板?

template<class T, int N> void f(T (&r)[N]){
}

int main(){
    int buf[10];
    f(buf);
}

編輯2:

qn 現在似乎具有 C 標記,而 C++ 標記已被刪除。

對於 C,您必須傳遞數組的長度(元素數)。

對於 C++,您可以傳遞長度,但是,如果您可以訪問 C++0x,最好使用std::array 請參閱此處此處 它攜帶長度,並在您使用at()成員函數訪問元素時提供越界檢查。

你可以試試這個...

#include <cstdio>                                                               

void 
print_array(int b[], size_t N) 
{ 
    for (int i = 0; i < N; ++i) 
        printf("%d ", b[i]);
    printf("\n");
}

template <size_t N>
inline void 
print_array(int (&b)[N]) 
{
    // could have loop here, but inline forwarding to
    // single function eliminates code bloat...
    print_array(b, N);
}                                                                                

int main()                                                                      
{                                                                               
    int a[] = { 1, 2 };                                                         
    int b[] = { };
    int c[] = { 1, 2, 3, 4, 5 };                                                

    print_array(a);                                                             
    // print_array(b);                                                          
    print_array(c);                                                             
}

...有趣的是 b 不起作用...

array_size.cc: In function `int main()':
array_size.cc:19: error: no matching function for call to `print_array(int[0u])'

JoshD 在問題下方的評論中指出了 0 大小的數組(GCC 擴展),以及上面的大小推斷。

C99 中,你可以要求一個數組至少有n元素:

void print_array(int b[static n]);

6.7.5.3.7 :將參數聲明為“類型數組”應調整為“類型限定指針”,其中類型限定符(如果有)是在 [ 和 ] 中指定的那些數組類型推導。 如果關鍵字 static 也出現在數組類型派生的 [ 和 ] 中,那么對於函數的每次調用,相應實參的值應提供對數組的第一個元素的訪問,該元素至少與指定的元素一樣多由大小表達式。

在 GCC 中,您可以像這樣隱式傳遞數組的大小

void print_array(int n, int b[n]);

在 c++ 中,您還可以使用某種類型的列表類,該類實現為具有 size 方法的數組或具有 size 成員的結構(在 c 或 c++ 中)。

使用變量傳遞數組的大小。 int sizeof_b = sizeof(b) / sizeof(b[0]); 除了獲取預先聲明的數組大小之外什么都不做,這是已知的,您可以將其作為參數傳遞; 例如, void print_array(int*b, int size) size也可以是用戶定義的大小。

int sizeof_b = sizeof(b) / sizeof(b[0]); 當元素數量小於預先聲明的數組大小時,將導致冗余迭代。

這個問題已經有了一些很好的答案,例如第二個 然而,缺乏解釋,所以我想擴展樣本並解釋它:

使用模板和模板參數,在這種情況下,使用無類型模板參數可以獲取任何類型的固定數組的大小。

假設您有這樣一個函數模板:

template<typename T, int S>
int getSizeOfArray(T (&arr)[S]) {
    return S;
}

該模板顯然適用於任何類型(此處為 T)和固定整數(S)。 如您所見,該函數引用了對 T 類型的 S 對象數組的引用,正如您在 C++ 中所知,您不能通過值將數組傳遞給函數,而是通過引用將數組傳遞給函數,因此該函數必須引用。

現在,如果你像這樣使用它:

int i_arr[] = { 3, 8, 90, -1 };
std::cout << "number f elements in Array: " << getSizeOfArray(i_arr) << std::endl;

編譯器會隱式實例化模板函數並檢測參數,所以這里的 S 是4 ,它被返回並打印到輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM