簡體   English   中英

陣列數組,大小不同

[英]Array of arrays, with different sizes

我有一個數組,每個單元格都有數組。 例如,大數組稱為arr

int a[3] = {3, 2, 1};
int b[2] = {2, 1};
int *arr[2] = {a, b}

現在問題是,如果我想在大陣列內打印小arrs。

這是我的代碼:

#include <stdio.h>

void printArr(int arr [], int n)
{
    for (int i = 0 ; i < n ; i++)
    {
        printf("%d ", *(arr + i));
    }
    printf("\n");
}

int main()
{
    int a[5] = {1, 8, 4, 2, 0};
    int b[3] = {1, 4, 2};
    int *arr [2] = {a, b};

    int n = 0;

    for (int i = 0 ; i < 2 ; i++)
    {
        printArr(*(arr + i), n);
    }
}

輸出應該是這樣的:

1 8 4 2 0 1 4 2

但我不能得到每個數組的大小,因為sizeof(*(arr + i)給我4,這是指針的大小(數組的名稱),而不是它自己的所有數組。那么什么我可不可以做?

謝謝!

問題:

C語言只提供了一種查找類型大小的方法。 這給出了將sizeof應用於以下內容之間的細微差別:

1)類型的數組,例如:

int a[3];
sizeof(a); // => 3 * sizeof(int)

2)指向類型的指針:

int *ptr;
sizeof(ptr); // => sizeof(int *)

要么

int a[3] = {3, 2, 1};
int b[2] = {2, 1};
int *arr[2] = {a, b};

sizeof(arr[1]); // => sizeof(int *)

一些解決方案

存儲大小

由於jfly建議存儲數組的大小。

  • 使查找大小成為一個恆定的時間操作。

附加結束標記

添加像'\\0'這樣的結束標記,用於c風格的字符串。 在這種情況下,您可以使用INT_MAXINT_MIN

printArr實現需要更改為:

void printArr(int *arr)
{
    int *it = arr;
    while(arr != INT_MIN);
    {
        printf("%d ", *it);
    }
    printf("\n");
}

缺點:

  • 查找數組的大小需要遍歷整個數組。
  • 存在實際值與結束標記值沖突的風險。

好處:

  • 變大小的數組可以作為單個參數傳遞。

使用迭代器

將指針存儲到第一個值,將指針存儲在最后一個值之后。

void printArr(int *begin, int *end)
{
    for (int *it = begin; it != end; it++)
    {
        printf("%d ", *it);
    }
    printf("\n");
}

int *end_arr[2] = {a + 3, b + 2};

for (int i = 0 ; i < 2 ; i++)
{
    printArr(arr[i], end_arr[i]);
}
  • 可以擴展到其他數據結構。

由於arr是一個指針數組,因此您無法從指向數組的指針獲取數組的大小,因此您需要額外的大小信息:

    int size_arr[2] = {sizeof(a) / sizeof(int), sizeof(b) / sizeof(int)};

    for (int i = 0 ; i < 2 ; i++)
    {
        printArr(arr[i], size_arr[i]);
    } 

暫無
暫無

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

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