C++ для начинающих - страница 33
>
Оба варианта эквивалентны и задают начальные значения для целой переменной ival как 1024 и для строки project как "Fantasia 2000".
Явную инициализацию можно применять и при определении переменных списком:
>double salary = 9999.99, wage = salary + 0.01;
>int month = 08;
>day = 07, year = 1955;
Переменная становится видимой (и допустимой в программе) сразу после ее определения, поэтому мы могли проинициализировать переменную wage суммой только что определенной переменной salary с некоторой константой. Таким образом, определение:
>// корректно, но бессмысленно
>int bizarre = bizarre;
является синтаксически допустимым, хотя и бессмысленным.
Встроенные типы данных имеют специальный синтаксис для задания нулевого значения:
>// ival получает значение 0, а dval - 0.0
>int ival = int();
>double dval = double();
В следующем определении:
>// int() применяется к каждому из 10 элементов
>vector int ivec( 10 );
к каждому из десяти элементов вектора применяется инициализация с помощью int(). (Мы уже говорили о классе vector в разделе 2.8. Более подробно об этом см. в разделе 3.10 и главе 6.)
Переменная может быть инициализирована выражением любой сложности, включая вызовы функций. Например:
>#include cmath
>#include string
>double price = 109.99, discount = 0.16;
>double sale_price( price * discount );
>string pet( "wrinkles" );
>extern int get_value();
>int val = get_value();
>unsigned abs_val = abs( val );
abs() – стандартная функция, возвращающая абсолютное значение параметра.
get_value()– некоторая пользовательская функция, возвращающая целое значение.
Какие из приведенных ниже определений переменных содержат синтаксические ошибки?
>(a) int car = 1024, auto = 2048;
>(b) int ival = ival;
>(c) int ival( int() );
>(d) double salary = wage = 9999.99;
>(e) cin int input_value;
Объясните разницу между l-значением и r-значением. Приведите примеры.
Найдите отличия в использовании переменных name и student в первой и второй строчках каждого примера:
>(a) extern string name;
>string name( "exercise 3.5a" );
>(b) extern vectorstring students;
>vectorstring students;
Какие имена объектов недопустимы в С++? Измените их так, чтобы они стали синтаксически правильными:
>(a) int double = 3.14159; (b) vector int _;
>(c) string namespase; (d) string catch-22;
>(e) char 1_or_2 = '1'; (f) float Float = 3.14f;
В чем разница между следующими глобальными и локальными определениями переменных?
>string global_class;
>int global_int;
>int main() {
>int local_int;
>string local_class;
>// ...
>}
3.3. Указатели
Указатели и динамическое выделение памяти были вкратце представлены в разделе 2.2. Указатель – это объект, содержащий адрес другого объекта и позволяющий косвенно манипулировать этим объектом. Обычно указатели используются для работы с динамически созданными объектами, для построения связанных структур данных, таких, как связанные списки и иерархические деревья, и для передачи в функции больших объектов – массивов и объектов классов – в качестве параметров.
Каждый указатель ассоциируется с некоторым типом данных, причем их внутреннее представление не зависит от внутреннего типа: и размер памяти, занимаемый объектом типа указатель, и диапазон значений у них одинаков . Разница состоит в том, как компилятор воспринимает адресуемый объект. Указатели на разные типы могут иметь одно и то же значение, но область памяти, где размещаются соответствующие типы, может быть различной:
* указатель на int, содержащий значение адреса 1000, направлен на область памяти 1000-1003 (в 32-битной системе);
* указатель на double, содержащий значение адреса 1000, направлен на область памяти 1000-1007 (в 32-битной системе).
Вот несколько примеров:
>int *ip1, *ip2;
>complexdouble *cp;
>string *pstring;
>vectorint *pvec;
>double *dp;
Указатель обозначается звездочкой перед именем. В определении переменных списком звездочка должна стоять перед каждым указателем (см. выше: ip1 и ip2). В примере ниже lp – указатель на объект типа long, а lp2 – объект типа long: