To są wskaźniki, więc wystarczy je tylko przestawić.
Tak edukacyjnie napisane...
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
void swap_char_ptrs(char ** ptr1, char ** ptr2) {
char * tmp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = tmp;
}
char ** create_table(const size_t m, const size_t n) {
char ** table = calloc(m, sizeof(*table));
for(size_t row = 0; row < m; ++row)
{
table[row] = calloc(n, sizeof(**table));
}
return table;
}
void dispose_table(char ** table, const size_t m) {
for(size_t row = 0; row < m; ++row) {
free(table[row]);
}
free(table);
}
void fill_table(char ** table, size_t m, size_t n) {
char element = 'a';
for(size_t row = 0; row < m; ++row) {
for(size_t col = 0; col < n; ++col) {
table[row][col] = element++;
}
}
}
void show_table(char ** table, size_t m, size_t n) {
for(size_t row = 0; row < m; ++row) {
for(size_t col = 0; col < n; ++col) {
printf("%c\t", table[row][col]);
}
putchar('\n');
}
}
void swap_row(char ** table, const size_t row1, const size_t row2) {
swap_char_ptrs(&(table[row1]), &(table[row2]));
}
int main(void) {
static const size_t m = 4;
static const size_t n = 3;
char** table = create_table(m, n);
fill_table(table, m, n);
show_table(table, m, n);
putchar('\n');
swap_row(table, 1, 3);
show_table(table, m, n);
dispose_table(table, m);
return 0;
}
BTW. Bez względu na to co mówi prowadzący, to najgłupszy z możliwych sposobów deklarowania i obsługi tablicy 2D.