Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
четные.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
72.12 Кб
Скачать
  1. Ввод-вывод в символьные массивы.

Строка являются массивом символов. Значением строки является указатель на первый ее символ:

char *string = "строка\n";

Здесь указатель на символы string будет содержать адрес первого символа 'c' строки "строка\n", которая размещается в некоторой области памяти, начиная с этого адреса: 

Здесь string[3] = = 'о'.

Рассмотрим фрагмент программы:

char buffer[ ] ="                ";     // Инициализация                                                      // строки из 10 пробелов.       char *string = buffer;    // string указывает на начало буфера.       string="проба\n";    // Присваивание!

При инициализации создается строка buffer и в нее помещаются символы (здесь 10 пробелов). Инициализация char *string=buffer устанавливает указатель string на начало этой строки.

Операция же присваивания в последней строке не копирует приведенную строку "проба\n" в массив buffer, а изменяет значение указателя stringтак, что он начинает указывать на строку "проба\n": 

Чтобы скопировать строку "проба\n" в buffer, можно поступить так:

char buffer[ ] = " ";       char *p ="проба\n";       int i =0;       while ( ( buffer[i] = p[i] ) != '\0' ) i++;

Или так:       char buffer[ ] = " "       char * p = "проба\n";       char * buf = buffer;       while (*buf ++ = *p ++ );

Здесь сначала *p копируется в *buf, т.е. символ 'п' копируется по адресу buf, который совпадает с адресом buffer, т.е. buffer[0] становится равен 'п'. Затем происходит увеличение указателей p и buf, что приводит к продвижению по строкам "проба\n" и buffer соответственно. Последний скопированный символ будет '\0', его значение - 0 и оператор while прекратит цикл.

Еще проще воспользоваться библиотечной функцией, прототип которой находится в файле string.h:

strcpy( buffer, "проба\n");

При копировании необходимо обеспечить, чтобы размер памяти, выделенной под buffer, был достаточен для хранения копируемой строки.

4) Доступ к глобальным переменным, скрытым локальными переменными с тем же именем (оператор ::).

В С++ предусмотрен доступ к глобальным переменным, скрытым локальными переменными с тем же именем. Операция разрешения области видимости :: позволяет в таких ситуациях воспользоваться глобальной переменной.

Например: int x=5; void main() { int x=3; printf("Локальная x= %d\n",x);

printf("Глобальная x= %d\n",:x); }

6) Инициализация массивов по умолчанию. Явная инициализация массивов.

Массив - это список значений переменных с одинаковым именем, для обращения к значениям которых используется индекс или список индексов. Как только размер массива объявлен, то он не может быть изменён. Массивы полезны, поскольку один и тот же тип данных может быть сохранен в одном месте. Данными могут быть примитивный тип данных или объект. К индивидуальным элементам массива можно обратиться с помощью имени массива и местоположения данного элемента. Местоположение также называют индексом. 

 Стандартный вид инициализации массива аналогичен инициализации переменных, как показано ниже: спецификатор типа имя_массива [размерN] ... [размер1] = {список значений};

 В следующем примере 10-элементный целочисленный массив инициализируется числами от 1 до 10: int i [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; Это означает, что i[0] получит значение 1, i[9] - 10.

Массивы символов, содержащие строки, допускают удобную инициализацию в виде char имя_массива [размер] = "строка"; При данной инициализации нулевой терминатор автоматически добавляется к концу строки. Нижеприведенный фрагмент кода инициализирует строку str фразой «hello»: char str[6] = "hello"; Это можно также записать: char str [ 6 ] = {'h', 'е', 'l', 'l', 'o', '\0'}; Обратим внимание, что в данной версии следует явным образом указать нулевой символ. Поскольку все строки в С оканчиваются нулевым символом, следует убедиться, что массив достаточно длинный для его вмещения. Именно поэтому str состоит из 6 символов, хотя «hello» имеет только 5 символов.

Многомерные массивы инициализируются так же, как и одномерные. Следующий пример инициализирует sqrs числами от 1 до 10 и их квадратами: int sqrs[10] [2] = { 1, 1 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100 }; Здесь sqrs[0][0] содержит 1, sqrs[0][1] содержит 1, sqrs[1][0] содержит 2, sqrs[1][1] содержит 4 и так далее. #include<iostream.h>

void main()

{int x[2][3]={1,1,1,

2,2,2};

for(int i=0;i<2;i++)

{for(int j=0;j<3;j++)

{

cout<<x[i][j]<<"\t";}

cout<<endl;}

}

При инициализации многомерных массивов можно добавить фигурные скобки вокруг каждого измерения. Это так называемая субагрегатная группировка. Ниже приведен еще один способ записи предыдущего объявления: int sqrs[10][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25}, {6, 36}, {7, 49}, {8, 64}, {9, 81}, {10, 100} };

При использовании субагрегатной группировки в случае неуказания требуемого количества инициализаторов для данной группы остальные члены установятся в 0 автоматически.