Это нетривиально понять, потому что массивы "странные" в C;это своего рода «особый случай» только по историческим причинам.
Что вам нужно знать, так это то, что массивы и указатели - это НЕ одно и то же;массив - это блок памяти с несколькими элементами один за другим, указатель - это адрес чего-то другого.
Что создает некоторую путаницу, так это то, что во многих местах, если вы используете массив, который язык C рассматривает вместомассив указатель на первый элемент массива (по-английски используемая фраза «массив распадается на указатель на первый элемент»).
Например,
int x[] = {1, 2, 3}; // x is an array
foo(x); // you cannot pass an array, a pointer to x[0] is passed instead
, поэтому вашкод недопустим, потому что это похоже на
int *x = {1, 2, 3}; // Invalid: {1, 2, 3} is not a valid initializer for a pointer
, когда вместо этого, как ни странно, это допустимо
int x[] = {1, 2, 3}; // An array
int *y = x; // Fine, it's like writing int *y = &x[0];
Во втором примере инициализация y
действительна, потому что в этом контекстеесть правило, согласно которому массив автоматически «распадается» на указатель на первый элемент.
Эта путаница возникает из-за того, что массивы не являются объектами, подобными другим (по историческим причинам), и, например, присваивают массивы или возвращаютмассив из функции или принятие параметра массива недопустимо (но, что удивительно, вы можете назначить структурупередайте структуры как параметры и верните структуры из функций ... даже если структура содержит массив).Исправление этой нелогичной асимметрии теперь не подлежит сомнению, так как это нарушит большинство существующих программ на C или C ++, изменив смысл существующего кода.
C и C ++, к сожалению, полны этих странных нелогичных правил, поэтому изучение Cили C ++ экспериментальным путем - плохая идея (с C это плохая идея, но может быть выполнимой, поскольку ее размер невелик, но с C ++ это самоубийство, потому что это буквально минное поле нелогичных ловушек и огромное).
Чтобы выучить C или C ++, вам нужно прочитать правила.
Не пытайтесь быть слишком умным и угадывать (угадывание не помогает, когда правильный ответ нелогичен).