пятница, 18 сентября 2009 г.

Массивы

В C++ очень многие понятия связаны с указателями. Не знаю нравится мне это или очень нравится, но я все чаще говорю "ух ты, прикольно!". Если написать в Паскале

var z : array[1..3] of Integer;

то переменная z будет массивом и все тут. Словно обертка над более низкоуровневыми типами. Хотя, может быть, это не совсем верно. Массив в C++:

int z[3];

В памяти отводится место(непрерывное) для трех int, а переменная z - указатель на первый элемент. Квадратные скобки просто делают удобнее работу с указателями. А раз так, то для получения значения, можно писать не только z[i], а еще и *(z+i).

z[i] == *(z+i)
&z[i] == z+i


Иными словами: Берем адрес первого элемента массива (адрес это z). Следующий элемент находится на sizeof(int) байт (у меня 4) дальше. Но количество байт нам знать не нужно, так как компилятор в курсе, что z - указатель на int, поэтому z+1 указывает на sizeof(int) дальше чем z, т.е на следующий элемент массива (на z[1]). Аналогично и z+i.

Еще пример
int* p = z+1;
int* p = &z[1];
//Обе записи эквивалентны.
cout << p[2]; //p - не массив, просто квадратные скобки смещают указатель и сразу разыменовывают.

В этом примере p[1]==z[2].

Комментариев нет:

Отправить комментарий

Можно использовать теги <b>, <i>