Мы можем передать массив 2d как один указатель, а также двойной указатель. Но во втором случае выход не так, как ожидалось. Итак, что не так во втором коде?При прохождении 2-мерного массива в зависимости от того, какая разница между одним указателем и двойным указателем?
Метод 1:
#include <stdio.h>
void print(int *arr, int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3, n = 3;
print((int *)arr, m, n);
return 0;
}
Выход:
1 2 3 4 5 6 7 8 9
Способ 2:
#include <stdio.h>
void print(int *arr[], int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
printf("%d ", *((arr+i*n) + j));
}
int main()
{
int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int m = 3;
int n = 3;
print((int **)arr, m, n);
return 0;
}
Выходной:
1 3 5 7 9 3 0 -1990071075 0
«Мы можем передать массив 2d как один указатель, а также двойной указатель» - вы можете передать его в виде четырехкратного указателя на «char». Это не значит, что это хорошая идея или определенное поведение для использования (а это не так, и его нет). То, что hard-cast to 'int **' и неспособность кода компилироваться без него, должны намекать на то, что вы так злитесь. «Int **» является указателем на указатель на 'int'. * * * * Преобразование' arr' в указатель в качестве выражения является 'int (*) [3]'. Эти типы * не эквивалентны *. Массивы не являются указателями, независимо от того, к чему вы, возможно, верили. – WhozCraig
Правило большого пальца в C состоит в том, чтобы избежать 2D-массивов. Просто используйте 1D-массив и получите доступ к нему как 'a [i * width + j]' ... –
Но @BasileStarynkevitch в моем проекте мне нужно передать 2D-массив для работы, поэтому я не могу избежать 2D-массива –