/ / Jak przypisać tylko jeden wymiar matrycy do prostej tablicy w C ++ [duplikat] - c ++, tablice, macierz, tablica wielowymiarowa

Jak przypisać tylko jeden wymiar macierzy do prostej tablicy w C ++ [duplikat] - c ++, tablice, macierz, tablica wielowymiarowa

Dlaczego nie mogę zrobić czegoś takiego w C ++? (W przeciwieństwie do JavaScript lub PHP)

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

//...reading the matrix...

ar = matrix[0];

oczekiwałbym ar zawierać matrix[0][0], matrix[0][1]...matrix[0][100]. Zamiast tego zwraca mi tylko adres pamięci. Dlaczego to nie działa (jakiej dokładnie funkcji nie ma C ++, czy są jakieś wady / zalety? Które?) I jak mogę zreplikować to zachowanie lub przynajmniej to samo zadanie. (bez konieczności zapętlania i kopiowania)

Odpowiedzi:

0 dla odpowiedzi № 1

Po usunięciu jednego przydziału z tablicy pozostaje pośrednik lub wskaźnik.

Więc:

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

Będzie działać.

macierz [x] [y] -> jest liczbą całkowitą

macierz [x] -> jest wskaźnikiem do int (lub można powiedzieć, że tablica ints zaczyna się od tego adresu)

Możesz także zainicjować ar, aby rozpocząć w dowolnym miejscu w macierzy:

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

1 dla odpowiedzi nr 2

Zadania w C ++ (operator =) działa według wartości, inne języki, takie jak php i javascript, są przypisywane przez referencje.

Aby robić, co chcesz, musisz pracować ze wskaźnikami:

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

row = matrix[0];

int value = row[50];

0 dla odpowiedzi № 3

Dlaczego nie mogę zrobić czegoś takiego w C ++?

Ponieważ tak naprawdę nie używasz żadnej funkcji C ++. Powinieneś użyć std::array który zapewni Ci kopię semantyczną dla Ciebie:

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

Przykład na żywo

powinieneś jednak pamiętać, że spowoduje to wykonanie kopii. Jeśli chcesz uzyskać dostęp do konkretnej tablicy, możesz zamiast tego użyć odwołania const / non-const:

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

Przykład na żywo


0 dla odpowiedzi nr 4

ar mieć typ int[100]. W dowolnym wyrażeniu (z wyjątkiem sizeof ar i &ar) ulegnie rozkładowi int *. I matrix rozpadnie się na int (*)[100]. Tak więc nie możesz po prostu przypisać tych wskaźników.

Nie możesz ich modyfikować, ale możesz wziąć ich adresy (będzie równy adresowi tablicy).

I jeszcze jedno: w rzeczywistości wskaźniki te nie zawsze istnieją w pamięci. A adres zepsutej tablicy będzie równy adresowi samej tablicy i adresowi jej pierwszego elementu.

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

0 dla odpowiedzi № 5

Zamiast tego zwraca mi tylko adres pamięci.

To prawda: macierz [0] to wskaźnik do tablicy 100 ints, podczas gdy ar to adres tablicy 100 ints. Możesz przypisać adres do zadeklarowanego wskaźnika, ale nie możesz przypisać wskaźnika, zadeklarowanego lub domyślnego, do zadeklarowanego adresu. Rzeczywisty kod

ar = matrix[0]

powinien pojawić się błąd kompilacji w wierszach „niezgodne typy w przypisaniu”.

Dlaczego to nie działa

Co masz na myśli przez pracę? Co chcesz robić?

Jeśli chcesz zaadresować konkretny „wiersz” macierzy, taki jak wiersz nr 0, możesz to zrobić

int *ar;
ar = matrix[0];

a następnie użyj składni indeksu dolnego, aby uzyskać dostęp do określonej komórki w tablicy

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

(bez konieczności zapętlania i kopiowania)

Kopie tablic wymagają pętli.