我正在尝试创建一个"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]);
}
所以您使用的是二维数组。您需要将其打印为arr[i][j]格式。
for(int i = 0; i < THREE; i++)
printf("%d", arr[THREE][i]);
这里有几个问题。我还不完全清楚你的目标是什么,但看起来你想处理一个二维数组,其中二维有不同的长度条目。
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");
}