Взяв от пользователя Zhehao Mao и исправив его, выглядело бы так:
#include <stdio.h>
void transpose(int *src, int *dest, int rows, int cols){
int i,j;
for(i=0; i<rows; i++){
for(j=0; j<cols; j++){
dest[j*rows + i] = src[i*cols + j];
}
}
}
int main(void)
{
int oldar[2][3] = {{1,2,3},{4,5,6}};
int newar[3][2];
transpose(&oldar[0][0], &newar[0][0], 2, 3);
int i, j;
for(i = 0; i < 2; i++)
{
for(j = 0; j < 3; j++)
printf("%d ", oldar[i][j]);
printf("\n");
}
for(i = 0; i < 3; i++)
{
for(j = 0; j < 2; j++)
printf("%d ", newar[i][j]);
printf("\n");
}
}
Причина, по которой оригинальный пост не может работать, в том, что int ** ожидает указатель на указатели, такие как:
int **a ---------> int *int1 --> 1
int *int2 --> 2
int *int3 --> 3
это не то, что мы получаем, когда говорим int a [n] [m]. Скорее у нас есть массив, организованный так
a[0][0]
\
1 2 3 4 5 6
\___/ \___/
"a[0]" / \____ "a[1]"
или что-то в этом роде. Картина, вероятно, не объясняет это хорошо, но в настоящее время я не могу сделать лучше.