ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
26 июня
41070 Топик полностью
ReAl (08.10.2005 18:23, просмотров: 1) ответил ReAl на Не, не уержался :-) Ещё пару слов перед уходом.
Тьху, эти 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 таки очень хочет, чтобы его пользователи врубились как следует в его указатели :-)