/ / C, Динамічне розподілення матриці: Чому це не дозволено? - c, покажчики, багатовимірний масив, покажчик на вказівник, розпад

C, Динамічне виділення матриці: чому це не дозволено? - c, покажчики, багатовимірний масив, покажчик на покажчик, розпад

Тому я маю такий приклад у деяких конспектах лекцій

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 поширених запитань про мову С. Там також з’являється ваше конкретне запитання:

Q 6.18: "Мій компілятор поскаржився, коли я передав двовимірний масив функції, що очікує вказівника на покажчик."