2017-03-21 4 views
-2

Ich versuche ein Array mit 8 anderen Arrays zu erstellen. Ich habe eine Funktion, die diese Arrays in ein größeres Array bringt. Ich habe Probleme Referenzierung meine Daten in dem Sub-Arrays:Referenzieren von Werten eines Arrays von Zeigern auf Arrays

void randomGen(int arr[]){ 
// fill vec10-vec1000000 with random values 
arr[0] = *vec10; 
arr[1] = *vec100; 
arr[2] = *vec1000; 
arr[3] = *vec10000; 
arr[4] = *vec100000; 
arr[5] = *vec100000; 
arr[6] = *up; 
arr[7] = *down; 
} 

Ich teste diese in Haupt-, und ich kann nicht einen Weg für den Zugriff auf alles anderes als den ersten Wert in jedem Feld finden. Ich bin nicht sicher, was die erste Spalte zeigt, die zweite Spalte ist der erste Eintrag in jedem von vec10-vec1000000, und die dritte ist einfach Iteration +1 auf den ersten Eintrag. Wie formatiere ich das, damit ich auf meine Sub-Arrays zugreifen kann? Ist meine Funktion zum Scheitern verurteilt?

First 4 elements of vec10: 12 5 9 17 
0: *(*(&a+i)): 12; *(a+i): 12; *(a)+i: 12 
1: *(*(&a+i)): 0; *(a+i): 1144108930; *(a)+i: 13 
2: *(*(&a+i)): 0; *(a+i): 984943658; *(a)+i: 14 
3: *(*(&a+i)): 0; *(a+i): 1622650073; *(a)+i: 15 
4: *(*(&a+i)): 0; *(a+i): 282475249; *(a)+i: 16 
5: *(*(&a+i)): 0; *(a+i): 282475249; *(a)+i: 17 
6: *(*(&a+i)): 0; *(a+i): 0; *(a)+i: 18 
7: *(*(&a+i)): 0; *(a+i): 9999; *(a)+i: 19 
8: *(*(&a+i)): 0; *(a+i): 0; *(a)+i: 20 
9: *(*(&a+i)): 0; *(a+i): 0; *(a)+i: 21 
+0

** vec10-vec100000, up ** und ** down ** sind int-Arrays richtig? Woher kommen sie? Wenn das der Fall ist, sollte Ihr ** arr ** Parameter ein 2d Array in Ihrer Funktionssignatur sein: 'void randomGen (int ** arr)' und dann können Sie auf seine Werte mit arr [i] [j] zugreifen, wobei ** i ** und ** j ** stehen für Ihre Zeile und Ihre Spalte, auf die zugegriffen wird. – 0xDEFACED

+0

Ja, diese Vektoren sind int-Arrays. Ich habe Ihren Vorschlag @ Santiago-Varela versucht, ich bekomme einen exc schlechten Zugriffsfehler. Ich habe folgende Anpassungen vorgenommen: 'int ** a; ' deklariert in main, 'void randomGen (int ** arr) {', und 'arr [0] = vec10;' in der Funktion randomGen und 'für (int i = 0; i <10; i ++) { cout <

Antwort

-1

Die folgenden Code-Snippets können helfen, diese Dinge zu umgehen, die Zeiger und Arrays betreffen.

// say you have 
int a[10], b[10], c[10]; 
// you can 
int *p[3] = {a, b, c}; // implicit conversion from int[10] to int * 
// or 
int (*pa[3])[10] = {&a, &b, &c}; 
// which is equivalent to 
using Array10 = int[10]; 
using PointerToArray10 = Array10 *; 
PointerToArray10 another_pa[3] = {&a, &b, &c}; 

// say you have 
int d[10], e[11], f[12]; 
// you can still 
int *pp[3] = {d, e, f}; 

// say you have 
void randomGen(int arr[]) 
// there isn't anything you can do 

Was Sie brauchen, ist

void randomGen(int *arr[]) { 
    arr[0] = a; // no deference, the same a as declared before 
    arr[1] = f; 
} 

Seit diesen Arrays whi ch, die Sie im arr "speichern" möchten, haben unterschiedliche Typen (gebunden), die einzige Option ist, die Adresse des ersten Elements jedes Arrays zu speichern, d. h. & a [0]. Arr müssen also den Typ an array of pointers haben (jedes Element dieses Arrays ist ein Zeiger).

Aber Array kann nicht als Funktionsparameter deklariert werden, sie werden immer zum Zeiger zerfallen. So, hier ist der Deal, erklären Sie eine Reihe von Zeiger irgendwo:

int *array[10]; 

und es dann passieren, um die Funktion

randomGen(array); 

und die Funktion das Array, das Sie übergeben einen Zeiger auf Zeiger zu initialisieren, dh int **arr oder int *arr[] (sie sind die gleichen in der Parameterliste), mit Array-to-Pointer-Konvertierung. Und der Funktionsparameter zeigt tatsächlich auf das erste Element von , d. H. &array[0]. (array[0]int * Typ, hat &array[0]int ** Typ)

Innerhalb der Funktion das Element des ursprünglichen Arrays durch den Zeiger zugreifen kann.

arr[0] // array[0] 
Verwandte Themen