/ / So weisen Sie einem einfachen Array in C ++ [duplicate] - c ++, Arrays, Matrix und multidimensionales Array nur eine Dimension einer Matrix zu

So weisen Sie einem einfachen Array in C ++ [duplizieren] - c ++, Arrays, Matrix, multidimensionales Array nur eine Dimension einer Matrix zu

Warum kann ich so etwas nicht in C ++ machen (anders als in JavaScript oder PHP)

int matrix[100][100], ar[100];

//...reading the matrix...

ar = matrix[0];

Ich würde erwarten ar enthalten matrix[0][0], matrix[0][1]...matrix[0][100]. Stattdessen wird mir nur eine Speicheradresse zurückgegeben. Warum funktioniert das nicht (was genau ist das Merkmal, das C ++ nicht hat, gibt es irgendwelche Nachteile / Vorteile? Welche?) Und wie kann ich dieses Verhalten oder zumindest dieselbe Aufgabe replizieren? (ohne schleifen und kopieren)

Antworten:

0 für die Antwort № 1

Wenn Sie ein Extent aus einem Array entfernen, bleibt eine Indirektion oder ein Zeiger erhalten.

Damit:

int matrix[100][100], *ar;
// ... doing stuff ...
ar = matrix[0];

Wird funktionieren.

Matrix [x] [y] -> ist ein int

Matrix [x] -> ist ein Zeiger auf ein int (oder Sie können sagen, ein Array von Ints, das an dieser Adresse beginnt)

Sie können auch initialisieren, um an einer beliebigen Stelle in der Matrix zu beginnen:

ar = &matrix[39][22]; //eg.

1 für die Antwort № 2

C ++ - Zuweisungen (operator =) funktioniert nach Wert, andere Sprachen, wie PHP und Javascript, durch Referenz zuweisen.

Um zu tun, was Sie wollen, müssen Sie mit Zeigern arbeiten:

int matrix[100][100]; // As a pointer, this can be seen as int **
int *row;

row = matrix[0];

int value = row[50];

0 für die Antwort № 3

Warum kann ich so etwas in C ++ nicht machen?

Weil Sie überhaupt keine C ++ - Funktion verwenden. Du solltest benutzen std::array die Ihnen eine semantische Kopie zur Verfügung stellen wird:

std::array<std::array<int, 100>, 100> matrix;
auto ar = matrix[0];

Live-Beispiel

Sie sollten sich jedoch dessen bewusst sein, dass dadurch eine Kopie erstellt wird. Wenn Sie nur auf ein bestimmtes Array zugreifen möchten, können Sie stattdessen eine const / non-const-Referenz verwenden:

std::array<std::array<int, 100>, 100> matrix;
const auto& ar = matrix[0];

Live-Beispiel


0 für die Antwort № 4

ar habe Typ int[100]. In jedem Ausdruck (außer sizeof ar und &ar) es verfällt in int *. Und matrix wird verfallen int (*)[100]. Sie können diese Zeiger also nicht einfach zuweisen.

Sie können sie nicht ändern, aber Sie können ihre Adressen verwenden (dies entspricht der Adresse des Arrays).

Und noch etwas: Tatsächlich sind diese Zeiger nicht immer im Speicher vorhanden. Die Adresse des zerfallenen Arrays ist gleich der Adresse des Arrays selbst und der Adresse des ersten Elements.

int arr[10]{};
std::cout << (int)arr << "t" << &arr << "n"; // 0x0001bfcd 0x0001bfcd
std::cout << (int)arr[0] << "t" << &arr[0] << "n"; // 0 0x0001bfcd

0 für die Antwort № 5

Stattdessen wird mir nur eine Speicheradresse zurückgegeben.

Das ist richtig: Matrix [0] ist a Zeiger zu einem Array von 100 Ints, während ar das ist Adresse eines Arrays von 100 Ints. Sie können einem deklarierten Zeiger eine Adresse zuweisen, einer deklarierten Adresse jedoch keinen deklarierten oder implizierten Zeiger. Der tatsächliche Code

ar = matrix[0]

sollte ein Kompilierungsfehler in den Zeilen "inkompatible Typen in Zuordnung" angezeigt werden.

Warum funktioniert das nicht?

Was meinst du mit Arbeit? Was möchten Sie tun?

Wenn Sie eine bestimmte "Zeile" der Matrix ansprechen möchten, z. B. Zeile # 0, können Sie dies tun

int *ar;
ar = matrix[0];

Verwenden Sie dann die Indexsyntax, um auf eine bestimmte Zelle im Array zuzugreifen

ar[50] = 42; // same as matrix[0][50] = 42

(ohne schleifen und kopieren)

Kopien von Arrays benötigen Schleifen.