阵列数组,大小不同

时间:2014-03-30 15:19:12

标签: c arrays pointers

我有一个数组,每个单元格都有数组。例如,大数组称为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,这是指针的大小(数组的名称),而不是它自己的所有数组。 那我该怎么办?

谢谢!

2 个答案:

答案 0 :(得分:7)

问题:

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建议存储数组的大小。

  • 使大小成为一个恒定的时间操作。

附加结束标记

添加用于c样式字符串的结束标记,如'\0'。 在这种情况下,您可以使用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]);
}
  • 可以扩展到其他数据结构。

答案 1 :(得分:1)

由于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]);
    }