Тьху, эти Enter-ы не вовремя... надо уже идти отдыхать... Чтобы уже совсем закрыть тему, повторяю.
Дано
int a[5];
В языке С записи
a[i]
*(a+i)
полностью эквивалентны.
Далее, оказывается, что и
i[a]
тоже им эквивалентна в силу перестановки слагаемых :-)
"найдите отличия" с текстом в предыдущем посте
void dump_triangle( int *a[], int size) { int x, y; for(y=0; yЭто компилируется и работает, хотя такая запсиь - уже даже с моей точки зрения - моветон. Массивов в языке С - нет. Есть указатели и есть помощь в формировании индекса для многомерных "массивов". Т.е. компилятор *слегка* помогает, и вместо int a[10*20]; a[20*y+x] можно писать int a[10][20]; a[y][x] Если бы массивы были, то в ещё более раннем моём посте на надо было бы писать в прототипе функуии func1 a[][20], сошло бы a[][] Кстати, вопрос любопытный :-) Какого типа эта переменная int arr[10][20]; Нормальному человеку ответ получить легко, попытавшись передать arr в функцию, скажем, foo(int)
- компилятор просто ругнётся:error: cannot convert `int (*)[20]' to `int' for argument `1' to `void foo(int)'
А вот вvoid foo(int (*a)[20])
передаёт самым довольным образом. Итого - arr имеет тип "указатель на `массив' из 20 int-ов" Аналогично можно выяснить типаint b[20]
, и он окажется "указатель на int", а не "массив int". Аarr[y]
это как бы "массив из 20 int", но на самом деле ри передаче в foo(int) компилятор нам сообщит, что он не может сконвертироватьint*
вint
, и ни о каких массивах речи нет :-) Ну и как резюме. Язык C таки очень хочет, чтобы его пользователи врубились как следует в его указатели :-)