Тому я маю такий приклад у деяких конспектах лекцій
void f(int **p){}
void g(int *p[]){}
void h(int p[2][3]){}
int main(){
int **a;
allocate_mem(a); // allocate memory for a
f(a); // OK!
g(a); // OK!
// h(a); // NOT OK
int b[2][3];
// f(b); // NOT OK
// g(b); // NOT OK
h(b); // OK!
return 0;
}
(без додаткових пояснень / коментарів). Я намагаюся зрозуміти, чому саме f (b) та g (b) були б незаконними. Обидві ці функції покликані приймати двовимірні масиви, і ми називаємо їх одним. Як це не працює? Я припускаю, що різниця полягає у розподілі пам'яті, але як це вплине на те, як функція приймає її як вхід?
Відповіді:
2 для відповіді № 1Ви "зв'язуєте покажчики з масивами, а покажчики - на покажчики - з двовимірними масивами.
Це зрозуміла помилка, зумовлена C (іC ++) "s" розпад масиву на вказівник ". Іноді ви можете звернутися до масиву та отримати вказівник на його перший елемент; колись це фактичний масив - залежить від контексту. А з двовимірними масивами він стає ще дивнішим, оскільки двовимірний масив можна використовувати в менше місця замість елемента вказівника на вказівник на елемент (але його все ще можна використовувати в дещо такі місця).
Проведіть кілька хвилин, читаючи про те, як вказівники та масиви співвідносяться та відрізняються у Розділ 6 поширених запитань про мову С. Там також з’являється ваше конкретне запитання: