Я "вивчаю 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])
. Перший [] можна замінити тільки на *, якщо ви передаєте такий масив до функції.