2016-04-09 4 views
0

Я пытаюсь создать 'int ** arr [5]', каждая ячейка в нем содержит 'int * array', каждый 'int * array' имеет другой размер. Всякий раз, когда я пытаюсь распечатать одну из ячеек, он печатает только первое число в нем, почему это происходит? как я могу напечатать весь массив?Указатель на указатель Array

#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]); 
} 
+1

Поскольку вы только печать одного элемента. Нужна петля. – OldProgrammer

+5

У вашего кода несколько проблем. Пожалуйста, прочитайте «указатели». –

+1

'* arr1' имеет тип' int * ', и то же самое относится к другим выражениям, используемым для инициализации' bigArr'. Если вы использовали '& arr1 [0]' вместо этого (введите «указатель на указатель« int »или« int ** »), тогда это будет хорошо. Кроме того, OldProgrammer прав, поскольку вам нужен цикл. вот вопрос, связанный с идеей цикла: откуда вы знаете, где заканчивается массив, прошедший в 'sortNumber'? Нет параметра' itemCount', а 'bigArr' не заканчивается каким-либо [значением дозорного] (https: //en.wikipedia.org/wiki/Sentinel_value), например указатель «NULL». –

ответ

0

Итак, вы работаете с 2-мерным массивом. Вам нужно будет распечатать его в формате arr [i] [j].

for(int i = 0; i < THREE; i++) 
    printf("%d", arr[THREE][i]); 
0

Здесь есть пара вопросов. Мне не совсем понятно, какова ваша цель, но похоже, что вы хотите иметь дело с 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"); 
} 
Смежные вопросы