Bardzo dobre pytanie. Tablica to nie dokładnie to samo co wskaźnik i to jest jeden z przypadków gdzie można się na tym przejechać.
int t[3][2] = { {1,2},{3,4},{5,6} };
int *ptr = &t[0][0];
cout<<"t[1] = " << t[1] << endl; //wypisze adres
cout << "ptr[3] = " << ptr[3] << endl; //wypisze 3
//petla wypisze 1 2 3 4 5 6
for (size_t i = 0; i < 3*2; i++) {
cout << ptr[i] << " ";
}
//int **tptr = t; // nie kompiluje sie
int(*tptr)[2] = t; // a to juz tak
Tablica gwarantuje ciągłośc pamięci więc tab[2][3] to w pamięci tak jakby tab[6] tylko, że kompilator pilnuje zebyś dostał odpowiedni element gdy napiszesz tab[1][0]. Wiecej info tutaj:
https://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory
A co do samego problemu to tak. Musisz przepisywać cale kolumny. No chyba, że zaalokujesz to ręcznie jak tablice wskaźnikow na tablice:
constexpr int n = 3, m = 2;
int **t2d = new int*[n];
for (size_t i = 0; i < n; i++){
t2d[i] = new int[m];
}
t2d[0] = t2d[2]; // mozna podmieniac kolumny
Jako ciekawostka z języka C:
int(*tab)[2] = malloc(sizeof(int)*2*3);
w ten sposób mamy tablice [3][2] zaalokowaną na stercie.
I jeszcze bardzo fajna stronka do ogarniecia skomplikowanych konsturkcji ze wskaznikami w stylu int (*t)[3]:
https://cdecl.org