0

我正在尝试制作一个“int** arr[5]”,其中的每个单元格都包含一个“int* 数组”,每个“int* 数组”都有不同的大小。每当我尝试打印其中一个单元格时,它只会打印其中的第一个数字,为​​什么会这样?我怎样才能打印整个数组?

#include <stdio.h>
#include <stdlib.h>

void sortNumber(int** arr[]);


int main(void)
{
    int i = 0;

    int* arr1[3] = { 2, 5, 8 };
    int* arr2[2] = { 1, 7 };
    int* arr3[6] = { 5, 1, 8, 3, 7 ,12 };
    int* arr4[4] = { 3, 9, 4, 29};
    int* arr5[5] = { 4, 11, 17, 23, 25 };

    int** bigArr[5] = {*arr1, *arr2, *arr3, *arr4, *arr5};

    sortNumber(bigArr);


    system("PAUSE");
    return 0;
}

void sortNumber(int** arr[])
{
    printf("%d", arr[1]);
}
4

2 回答 2

0

这里有几个问题。我并不完全清楚你的目标是什么,但看起来你想要处理一个二维数组,其中二维有不同的长度条目。

int* arr1[3] = { 2, 5, 8 };

在那里你创建一个包含指针的数组。您正在用数字初始化元素,但这些是指针——条目指向由数字表示的内存地址。即第一个元素指向内存地址2——真的是这样吗?如果你想存储数字,你需要在这里使用一个简单的数组。

int** bigArr[5] = {*arr1, *arr2, *arr3, *arr4, *arr5};

在这里,您将等值分配arr1给 的元素bigArr。但是,由于您取消引用,arr1您不会获得指向数组的指针。相反,您会得到第一个元素的值(*arr1与 基本相同arr1[0])。所以现在bigArr存储int**值,它们只是子数组的第一个元素。不存储指向子数组的指针。您可以通过指针或数组访问来访问数组元素,这基本上就是这里出了问题。

谈到一般的指针:以下两行行为相同:

int a = arr1[1];
int b = *(arr1 + 1);

以及您可以通过两种不同的方式获取指向数组的指针。最后,两个指针都指向数组的第一个元素:

int array[] = {1, 2, 3};
int *ptr1 = array;
int *ptr2 = &array[0];

最后,C 不存储数组的长度——你需要知道这一点。

我假设您要存储这样的数据结构:

[
 [ 2, 5, 8 ],
 [ 1, 7 ],
 [ 5, 1, 8, 3, 7, 12 ],
 [ 3, 9, 4, 29 ],
 [ 4, 11, 17, 23, 25 ]
]

为此,您不需要双指针。此外,您需要存储子数组的长度。解决此问题的一种方法是使用结构数组。

struct row {
    int* data;
    int length;
};

int arr1[3] = { 2, 5, 8 };
int arr2[2] = { 1, 7 };
// ...

struct row r1 = {arr1, 3};
struct row r2 = {arr2, 2};
// ...
struct row *bigArr[] = {r1, r2, ...};

现在sortNumber更改为

void sortNumber(struct row* r)
{
    for(int i = 0; i < r->length; i++) {
        printf("%i ", r->data[i]);
    }
    printf("\n");
}
于 2016-04-09T20:04:11.463 回答
0

所以你正在使用二维数组。您需要以 arr[i][j] 格式打印它。

for(int i = 0; i < THREE; i++)
   printf("%d", arr[THREE][i]);
于 2016-04-09T19:27:31.070 回答