2016-04-09 9 views
0

'int ** arr [5]'を作成しようとしていますが、各セルに 'int * array'が含まれていて、それぞれ 'int * array'のサイズが異なります。セルの1つを印刷しようとしているときはいつも、最初の番号だけが印刷されますが、どうしてですか?どうすれば配列全体を印刷できますか?ポインタへのポインタ配列

#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

からsortNumber変更印刷されているので。ループが必要です。 – OldProgrammer

+5

コードにはいくつかの問題があります。 「ポインタ」を読んでください。 –

+1

'* arr1'は' int * '型で、' bigArr'を初期化するために使われる他の式も同じです。代わりに、 '&arr1 [0]'を使った場合(intポインタへのポインタや 'int **'へのポインタ)、それはうまくいくでしょう。ループのアイデアに関連する質問は次のとおりです:配列が 'sortNumber'に渡された場所を知る方法' itemCount'パラメータがなく、 'bigArr'が[sentinel value](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次元の長さが異なる2次元配列を扱うように見えます。

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

ここでは、ポインタを含む配列を作成します。要素を数値で初期化していますが、それらはポインタです。エントリは、数値で示されるメモリアドレスを指します。私。最初の要素はメモリアドレス2を指しています - 本当に意図していますか?数字を格納したい場合は、単純な配列をここで使用する必要があります。ここで

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

あなたはbigArrの要素にようにarr1の値をassigneと。しかし、arr1を逆参照するので、配列へのポインタを取得しません。代わりに、最初の要素の値を取得します(*arr1は基本的にarr1[0]と同じです)。今すぐbigArrは、サブアレイの最初の要素であるint**の値を格納します。サブアレイへのポインタは格納されません。ポインタや配列のアクセスで配列要素にアクセスすることができます。これは基本的にここで間違っています。

一般的には、ポインタについて話すこと:

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

だけでなく、次の2つの異なる方法で配列へのポインタを取得することができます:次の2行は同じ動作をします。最終的には両方のポインタは、配列の最初の要素を指す:

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, ...}; 

今、あなたは一つだけの要素を

void sortNumber(struct row* r) 
{ 
    for(int i = 0; i < r->length; i++) { 
     printf("%i ", r->data[i]); 
    } 
    printf("\n"); 
} 
関連する問題