/ / Come assegnare una sola dimensione di una matrice a un array semplice in C ++ [duplicato] - c ++, array, matrice, matrice multidimensionale

Come assegnare una sola dimensione di una matrice a un array semplice in C ++ [duplicato] - c ++, array, matrice, matrice multidimensionale

Perché non posso fare qualcosa di simile in C ++? (A differenza di JavaScript o PHP)

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

//...reading the matrix...

ar = matrix[0];

Mi aspetterei ar contenere matrix[0][0], matrix[0][1]...matrix[0][100]. Invece, mi restituisce solo un indirizzo di memoria. Perché non funziona (qual è la caratteristica esatta che C ++ non ha, ci sono degli svantaggi / vantaggi? Quale?) E come posso replicare questo comportamento o almeno lo stesso compito. (senza dover ricorrere al loop e copiare)

risposte:

0 per risposta № 1

Quando rimuovi un extent da un array, ti rimane un puntatore o un puntatore indiretto.

Così:

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

Funzionerà.

matrice [x] [y] -> è un int

matrix [x] -> è un puntatore a un int (o si potrebbe dire una matrice di interi che iniziano a quell'indirizzo)

È anche possibile inizializzare ar per iniziare in qualsiasi punto della matrice:

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

1 per risposta № 2

Assegnazioni C ++ (operator =) funziona in base al valore, altre lingue, come php e javascript, assegnano per riferimento.

Per fare ciò che vuoi, devi lavorare con i puntatori:

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

row = matrix[0];

int value = row[50];

0 per risposta № 3

Perché non posso fare qualcosa di simile in C ++?

Perché in realtà non stai utilizzando alcuna funzione C ++. Dovresti usare std::array che fornirà una copia semantica per te:

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

Esempio dal vivo

dovresti essere consapevole, tuttavia, che questo farà una copia. Se vuoi semplicemente accedere ad un particolare array puoi usare invece un riferimento const / non-const:

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

Esempio dal vivo


0 per risposta № 4

ar avere tipo int[100]. In qualsiasi espressione (tranne sizeof ar e &ar) decadrà a int *. E matrix decadrà a int (*)[100]. Quindi, non puoi semplicemente assegnare questi suggerimenti.

Non puoi modificarli, ma puoi prendere i loro indirizzi (sarà uguale all'indirizzo dell'array).

E un'altra cosa: infatti, questi puntatori non sono sempre presenti nella memoria. E l'indirizzo dell'array decaduto sarà uguale all'indirizzo dello stesso array e all'indirizzo del primo elemento di esso.

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

0 per risposta № 5

Invece, mi restituisce solo un indirizzo di memoria.

È corretto: la matrice [0] è a pointer a un array di 100 pollici, mentre ar è il indirizzo di una serie di 100 pollici. È possibile assegnare un indirizzo a un puntatore dichiarato, ma non è possibile assegnare un puntatore, dichiarato o implicito, a un indirizzo dichiarato. Il codice attuale

ar = matrix[0]

dovrebbe ottenere un errore di compilazione sulle righe "tipi incompatibili nell'assegnazione".

Perché non funziona?

Cosa intendi per lavoro? Che cosa vuoi fare?

Se vuoi indirizzare una particolare "riga" della matrice, come la riga # 0, puoi farlo

int *ar;
ar = matrix[0];

e quindi utilizzare la sintassi del pedice per accedere a una particolare cella dell'array

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

(senza dover ricorrere al loop e copiare)

Le copie degli array hanno bisogno di loop.