Здесь есть пара вопросов. Мне не совсем понятно, какова ваша цель, но похоже, что вы хотите иметь дело с 2-мерным массивом, где второе измерение имеет разные длины.
int* arr1[3] = { 2, 5, 8 };
Здесь вы создаете массив, содержащий указатели. Вы инициализируете элементы с числами, но это указатели - записи указывают на адрес памяти, обозначенный номером. То есть первый элемент указывает на адрес памяти 2 - действительно ли это предназначено? Если вы хотите хранить номера, вам нужно использовать простой массив.
int** bigArr[5] = {*arr1, *arr2, *arr3, *arr4, *arr5};
Здесь вы assigne значение 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.
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");
}
Поскольку вы только печать одного элемента. Нужна петля. – OldProgrammer
У вашего кода несколько проблем. Пожалуйста, прочитайте «указатели». –
'* arr1' имеет тип' int * ', и то же самое относится к другим выражениям, используемым для инициализации' bigArr'. Если вы использовали '& arr1 [0]' вместо этого (введите «указатель на указатель« int »или« int ** »), тогда это будет хорошо. Кроме того, OldProgrammer прав, поскольку вам нужен цикл. вот вопрос, связанный с идеей цикла: откуда вы знаете, где заканчивается массив, прошедший в 'sortNumber'? Нет параметра' itemCount', а 'bigArr' не заканчивается каким-либо [значением дозорного] (https: //en.wikipedia.org/wiki/Sentinel_value), например указатель «NULL». –