/ / Який тип покажчика багатовимірного масиву при передачі функції? [дублювати] - c, масиви, покажчики, багатовимірний масив

Який тип покажчика багатомірного масиву при передачі функції? [дублікат] - c, масиви, покажчики, багатовимірний масив

Я "вивчаю C та покажчики у мойому університетському класі, та я думаю я" "мав досить гарне розуміння на концепції за винятком подібності між багатовимірними масивами та покажчиками.

Я подумав, що оскільки всі масиви (навіть багатовимірні) зберігаються в безперервній пам'яті, можна безпечно перетворити його на int* (припускаючи, що даний масив є int[].) Однак мій професор сказав, що кількість зірок у визначенні залежить від кількості розмірів в масиві. Отже, int[] став би int*, a int[][] став би int**і т. д.

Тому я написав невелику програму для перевірки цього:

void foo(int** ptr)
{

}

void bar(int* ptr)
{

}

int main()
{
int arr[3][4];

foo(arr);
bar(arr);
}

На мій подив, компілятор видав попередження обидва викликів функцій.

main.c:22:9: warning: incompatible pointer types passing "int [3][4]" to parameter of type
"int **" [-Wincompatible-pointer-types]
foo(arr);
^~~
main.c:8:16: note: passing argument to parameter "ptr" here
void foo(int** ptr)
^
main.c:23:9: warning: incompatible pointer types passing "int [3][4]" to parameter of type
"int *" [-Wincompatible-pointer-types]
bar(arr);
^~~
main.c:13:15: note: passing argument to parameter "ptr" here
void bar(int* ptr)
^
2 warnings generated.

Що тут відбувається? Як можна змінити виклики функцій, щоб один з них прийняв масив?

Редагувати: Це ні дублікат Як передати багатовимірний масив функції в C і C ++ тому що я запитую, як змінити самі виклики функцій, а не підписи функцій.

Відповіді:

1 для відповіді № 1

Масиви і покажчики не є абсолютно вільно конвертованими void foo(int (*ptr)[4]). Перший [] можна замінити тільки на *, якщо ви передаєте такий масив до функції.