7. Указатель на переменную и константу.
Указатель может быть константой или переменной, а также указывать на константу или переменную.
int i; // целая переменная
const int ci = 1; // целая константа
int * p i ; // указатель на целую переменную
const int * pci; // указатель на целую константу
int * const ср = &i; // указатель-константа на целую
const int * const срс = &ci; // указатель-константа на целую
Как видно из примеров, модификатор const, находящийся между именем указателя и звездочкой, относится к самому указателю и запрещает его изменение, а const слева от звездочки задает посто-янствозначения, на которое он указывает.
Для инициализации указателей использована операция получения адреса &.
Величины типа указатель подчиняются общим правилам определения области действия, видимости и времени жизни.При определении указателя надо стремиться выполнить его инициализаци
Инициализация указателей.
При определении указателя надо стремиться выполнить его инициализацию, то есть присвоение начального значения.Непреднамерен-ноеиспользование неинициализированных указателей —распространенныйисточник ошибок в программах. Инициализатор записыва-ется после имени указателя либо в круг-лых скобках, либо после знака равенства.
Существуют следующие способы инициализации указателя:
1. Присваивание указателю адреса существующего объекта:
• с помощью операции получения адреса:
int а = 5; // целая переменная
int* р = &а; //в указатель записывается адрес а
int* р (&а): // то же самое другим способом
• с помощью значения другого инициализированного указателя:
• с помощью имени массива или функции, которые трактуются как адрес:
int b[10]; // массив
i n t * t = b; // присваивание адреса начала массива
void f ( int а ) < /* . * / >// определение функции
void ( * pf ) ( int ); // указатель на функцию
pf = f; // присваивание адреса функции
2. Присваивание указателю адреса области памяти в явном виде:
char* vp = (char *)0хВ8000000:
Здесь ОхВ8000000 — шестнадцатеричная константа, (char *) — опе-рацияприведения типа: константа преобразуется к типу «указатель на char».
3. Присваивание пустого значения:
В первой строке используется константа NULL, определенная в некоторых заголовочных файлах С как указатель, равный нулю. Рекомендуется использовать просто О, так как это значение типа int будет правильно преобразовано стандартными способами в соответ-ствии с контекстом. Поскольку гарантируется,что объектов с нулевым адресом нет, пустой указатель можно использовать для проверки, ссылается указатель на конкретный объект или нет.
Никогда не следует использовать неинициализированные указатели, потому что это приводит к ошибкам, которые весьма трудно подда-ются отладке.Инициализация указателей более актуальна, чем пере-менных, так как поведение программы, имеющей неопределённые указатели, непредсказуемо и часто вызывает зависание системы.
Работа с указателями.
Объявить:
Указатели объявляются в списке переменных,но перед их именем ста-витсязнак*. Указатель всегда указывает на переменную того типа, для которого он был объявлен. Например,pC может указывать налю-бойсимвол,pI – на любое целое число,аpF – на любое вещественное число.
Присвоить адрес:
Такая запись означает: «записать в указатель pI адрес переменнойi». Запись&i обозначает адрес переменнойi.
Получить значение по этому адресу:
float f , *pF;
Такая запись означает: «записать в переменную f то вещественное число, на которое указывает указательpF». Запись*pF обозначает содержимое ячейки, на которую указываетpF.
В результате этих операций значение указателя меняется особым спо-собом:pI++ сдвигает указатель на РАЗМЕР ЦЕЛОГО ЧИСЛА, то есть на 4 байта, а не на 1 как можно подумать.А записьpI+=4 илиpI=pI+4
сдвигает указатель на 4 целых числа дальше, то есть на 16 байт.
Если указатель равен нулевому адресу NULL, это обычно означает, что указатель недействительный. По нему нельзя ничего записывать (это вызывает сбой программы компьютера).
Вывести на экран:
printf(«Адр.i =%p», pI);
Для вывода указателей используется формат %p или %u.
Основы алгоритмизации и программирования тест сделайте пожалуйста
Вопрос 1 (10454)
Укажите, какое из нижеследующих утверждений ложное.
1: Комментарии при выполнении программы вызывают печать компьютером на экране текста после символов //.
2: Если вывод осуществляется в cout, то esc-последовательность \n вызывает перемещение курсора к началу следующей строки на экране.
3: Все переменные должны быть объявлены до того, как они используются.
4: Все высказывания истинные
Вопрос 2 (10455)
Укажите, какое из нижеследующих утверждений ложное.
1: Всем переменным, когда они объявляются, должен быть присвоен тип.
2: C++ рассматривает переменные number и NuMbEr как одинаковые.
3: Объявления в теле функции C++ могут появляться почти везде.
4: Все высказывания истинные
Вопрос 3 (10456)
Укажите, какое из нижеследующих утверждений ложное.
1: Операция взятия по модулю (%) может применяться только к целым числам.
2: Все арифметические операции *, /, %, + и — имеют одинаковый уровень приоритета.
3: Пустые скобки, следующие за именем функции в прототипе, указывают, что функции для выполнения ее задачи не требуется никаких параметров.
4: Все высказывания истинные
Вопрос 4 (10457)
Укажите, какое из нижеследующих утверждений ложное.
1: Тело каждой функции ограничивается левой и правой фигурными скобками ( < и >).
2: Программа на C++, которая выводит три строки, должна содержать три оператора вывода, использующих cout.
3: Элементы данных или элемент-функции, объявленные со спецификатором доступа private, доступны для элемент-функций класса, в котором они объявлены.
4: Все высказывания истинные
Вопрос 5 (10458)
Укажите, какое из нижеследующих утверждений истинное.
1: В соответствии с соглашением, имена функций начинаются с прописной буквы, и все последующие слова в имени также начинаются с прописной буквы.
2: Переменные, объявленные в теле некоторой элемент-функции, называются элементами данных и могут использоваться во всех элемент-функциях класса.
3: Для исполнения программы можно использовать любой файл исходного кода, содержащий int main().
4: Указатель, объявленный как void, может быть разыменован.
Вопрос 6 (10459)
Укажите, какое из нижеследующих утверждений истинное.
1: Типы аргументов в вызове функции должны быть согласованы с типами соответствующих параметров в списке параметров прототипа функции.
2: В операторе выбора switch должна быть метка default.
3: В операторе выбора switch в разделе default требуется оператор break.
4: Все высказывания истинные
Вопрос 7 (10460)
Укажите, какое из нижеследующих утверждений истинное.
1: Выражение, содержащее операцию ||, истинно, если истинны оба операнда этой операции.
2: Массив может хранить много различный типов данных.
3: Операция взятия адреса может быть применима только к константам, к выражениям, не дающим в качестве результата ссылки, и к переменным, объявленным с классом памяти register.
4: Все высказывания ложные
Вопрос 8 (10461)
Укажите, какое из нижеследующих утверждений истинное.
1: Если количество начальных значений в списке инициализации меньше, чем количество элементов массива, оставшиеся элементы автоматически получают в качестве начальных значений последние значения из списка инициализации.
2: Если список инициализации содержит начальных значений больше, чем элементов массива, то это — ошибка.
3: Отдельный элемент массива, который передается функции и модифицируется в этой функции, будет содержать модифицированное значение после завершения выполнения вызываемой функции.
4: Все высказывания ложные
Вопрос 9 (10462)
Укажите, какое из нижеследующих утверждений истинное.
1: Когда исполнение программы приостанавливается в контрольной точке, следующим оператором, который будет исполняться, является оператор после контрольной точки.
2: Когда значение переменной изменяется, в окнах Autos и Locals оно выделяется желтым цветом.
3: Во время отладки команда Step Out исполняет все оставшиеся операторы текущей функции и возвращает управление в точку, где была вызвана функция.
4: Все высказывания истинные
Вопрос 10 (10463)
Укажите, какое из нижеследующих утверждений ложно.
1: Указатели разных типов нельзя присваивать друг другу без операции приведения типа.
2: Выражение (х > у && а < b) истинно, если х > у или а < b.
3: Все высказывания ложные
4: Индексы массива обычно должны иметь тип float.
Вопрос 11 (10464)
Выполнение каждой программы на C++ начинается с функции__________.
1: void
2: include
3: main
4: using
Вопрос 12 (10465)
Каждый оператор заканчивается__________.
1: endl
2: return
3: точкой с запятой
4: управляющей последовательностью
Вопрос 13 (10466)
Оператор________ используется для принятия решений
1: cout
2: if
3: while
4: for
Вопрос 14 (10467)
Оператор выбора________ используется для выполнения одного действия, если его условие истинно, и другого действия, если условие ложно
1: If
2: If…then
3: If…then…else
4: If…else
Вопрос 15 (10468)
Повторение набора инструкций заданное число раз называется______ повторений
1: управляемым счетчиком
2: числом
3: заданием
Вопрос 16 (10469)
Когда заранее не известно, сколько раз должна исполняться группа операторов, для прерывания повторения можно использовать________ значение
1: контрольное
2: сигнальное
3: фиктивное
4: все ответы верны
Вопрос 17 (10470)
Списки и таблицы значений хранятся в__________
1: массиве
2: указателе
3: списке
4: стандартной библиотеке
Вопрос 18 (10471)
Элементы массива связаны тем, что они имеют одни и те же _________
1: имя
2: тип
3: значения
4: размерность
Вопрос 19 (10472)
Число, используемое для обращения к отдельному элементу массива называется____________
1: тип
2: индекс
3: значение
4: позиция
Вопрос 20 (10473)
Для объявления размера массива должна использоваться__________, потому что она делает программу более масштабируемой
1: переменная
2: константа
3: именованная константа
4: символ
Вопрос 21 (10474)
Процесс упорядоченного размещения элементов в массиве называется___________
1: сортировка
2: поиск
3: проверка
4: изменение
Вопрос 22 (10599)
Процесс определения значения ключа, содержащегося в массиве, называется___________
1: сортировка
2: поиск
3: проверка
4: изменение
Вопрос 23 (10600)
Указатель — это переменная, которая содержит в качестве своего значения __________другой переменной
1: индекс
2: адрес
3: код
4: ссылку
Вопрос 24 (10601)
Для инициализации указателя можно использовать
1: null
2: 0
3: адрес
4: все перечисленное
Вопрос 25 (10602)
Целое, которое может быть присвоено указателю, является
1: 0
2: положительным
3: отрицательным
4: все перечисленное
Вопрос 26 (10603)
Что такое идентификаторы в языке Си++ ?
1: это последовательность знаков, начинающаяся с буквы или знака подчеркивания
2: это последовательность знаков
3: это последовательность знаков, начинающаяся с буквы
4: это последовательность знаков, начинающаяся со знака подчеркивания
Вопрос 27 (10604)
В идентификаторах можно использовать
1: заглавные и строчные латинские буквы, цифры и знак подчеркивания
2: заглавные и строчные латинские буквы, цифры и знак подчеркивания
3: заглавные и строчные латинские буквы
4: заглавные и строчные латинские буквы, цифры
5: заглавные и строчные латинские буквы, знак подчеркивания
Вопрос 28 (10605)
Что является выражениями в языке Си++ ?
1: это переменные, функции и константы объединенные знаками операций
2: это переменные объединенные знаками операций
3: это функции объединенные знаками операций
4: это константы объединенные знаками операций
Вопрос 29 (10606)
Какая из операций не относится к операции сравнения?
1: (=)
2: (>)
3: (<)
4: (==)
5: (!=)
Вопрос 30 (10607)
В результате успешной компиляции текста программы на C++ с каким расширением будет получен файл?
1: .obj
2: .exe
3: .cpp
4: .h
Вопрос 31 (10608)
Если не будет указан базовый тип, то какай тип будет подразумеваться по умолчанию
1: int
2: char
3: short
4: long
Вопрос 32 (10609)
К чему применяется операция инкримента?
1: к переменным
2: к константам
3: к выражениям
4: к строкам
Вопрос 33 (10610)
К каким числам применима операция %?
1: к целым
2: к вещественным
3: и к целым и к вещественным
Вопрос 34 (10611)
Какой операции нет в C++?
1: последовательной
2: унарной
3: бинарной
4: тернарная
Вопрос 35 (10612)
Из чего состоит оператор объявления имени?
1: из названия типа и объявляемого имени
2: из названия типа
3: из объявляемого имени
Вопрос 36 (10613)
Оператор while соответствует оператору for:
1: for ( ; условие ; )
оператор
2: for ( условие; ; )
оператор
3: for ( ; ; условие)
оператор
Вопрос 37 (10614)
В языке Си++ лексема — это:
1: набор специальных символов и директив
2: множество строк, определяющих состояние программы
3: процедура, выполняющая определенные задания
4: последовательности символов языка, разделяющиеся пробелами и други¬ми неграфическими символами
Вопрос 38 (10615)
В языке Си++ указатель — это:
1: специальный значок, показывающий, что это динамическая переменная
2: символическое представление адреса ячейки памяти
3: символ, указывающий на что-либо
4: метка
Вопрос 39 (10616)
В языке Си++ литерал — это:
1: переменная зарезервированного типа
2: неизменяемый объект языка
3: строка
4: буква
Вопрос 40 (10617)
Комментарии заключаются в скобки:
1: < >
2: /* */
3: [ ]
4: /% %/
Вопрос 41 (10618)
Идентификатор — это:
1: последовательность латинских букв, цифр и символа «_», начинающаяся с буквы или символа «_»
2: неизменяемые объекты языка (константы)
3: последовательность латинских и русских букв
4: способ кодирования, допустимые преобразования над значением данной переменной
Вопрос 42 (10619)
Фактический адрес в указателях — это:
1: строка
2: указатель
3: число
4: буква
Вопрос 43 (10620)
Составной оператор — это:
1: последовательность операторов, заключенная в фигурные скобки < >
2: последовательность операторов, заключенная квадратные скобки [ ]
3: последовательность операторов, заключенная в операторные скобки begin . end
4: последовательность операторов, заключенная в круглые скобки ( )
Вопрос 44 (10621)
Спецификация типа — это:
1: задание типа переменной
2: список переменных
3: перечисление всех переменных, которые использовались в программе
4: список типов переменных, которые использовались в программе
Вопрос 45 (10622)
Логическое «не равно» обозначается:
1: <>
2: ||
3: !
4: !=
Вопрос 46 (10623)
Логическое «и» обозначается:
1: =
2: ||
3: &
4: &&
Вопрос 47 (10624)
Логическое «не» обозначается:
1: !
2: !!
3: ||
4: not
Вопрос 48 (10625)
Битовая операция инверсии битов обозначается:
1: \
Вопрос 49 (10626)
Битовая операция исключающего «или» обозначается:
1: \
Вопрос 50 (10627)
Операция битового «и» обозначается:
1: \
Вопрос 51 (10628)
Операция битового «или» обозначается:
1: \
Вопрос 52 (10629)
Текстовый поток — это:
1: логическое понятие, которое система может относить к чему угодно — от дисковых файлов до терминалов
2: последовательность символов, которая организуется в строки, завершающиеся символами новой строки
3: последовательность символов, которая организуется в списки слов, завершающиеся точкой с запятой
4: текст программы
Вопрос 53 (10630)
Выражения — это:
1: конструкции, включающие константы (литералы), переменные, знаки операций, скобки для управления порядком выполнения операций, обращения к функциям
2: основные строительные блоки программы; в языке Си++ указанием на наличие выражения служит символ «точка с запятой», стоящий в конце него
3: набор символов и операций
4: операторы, выполняющие определенные действия с переменными
Вопрос 54 (10631)
Тернарное выражение — это:
1: компактный способ записи оператора WHILE/DO
2: компактный способ записи оператора IF/ELSE
3: выбор одного из нескольких вариантов
4: выражение, описывающее действия логических связывающих операторов на переменные
Вопрос 55 (10632)
Оператор-переключатель — это:
1: оператор для выбора одного из нескольких вариантов (SWITCH)
2: строка с меткой DEFAULT
3: CASE
4: BREAK
Вопрос 56 (10633)
Оператор цикла DO/WHILE является:
1: конструкцией цикла с предусловием
2: конструкцией цикла с постусловием
3: конструкцией цикла с выбором варианта
4: конструкцией цикла с перебором значений параметра
Вопрос 57 (10634)
Формальный аргумент — это:
1: конкретное значение, присвоенное этой переменной вызывающей программой
2: переменная и вызываемой программе
3: строка, которая пишется в скобках функции
4: строка, которая пишется в скобках процедуры
Вопрос 58 (10635)
Фактический аргумент — это:
1: конкретное значение, присвоенное этой переменной вызывающей программой
2: переменная в вызываемой программе
3: строка, которая пишется в скобках функции
4: строка, которая пишется в скобках процедуры
Вопрос 59 (10636)
Писать # include <stdio.h> нужно для:
1: подключения файла, содержащего макроопределения и объявления данных, необходимых для работы функций из стандартной библиотеки ввода-вывода
2: позволяет дать в программе макроопределения (или задать макросы)
3: переопределения не только константы, но и целых программных конструкций
4: замены каждого параметра в строке лексем на соответствующий аргумент макровызова
Вопрос 60 (10637)
Точка с запятой является:
1: разделителем операторов
2: частью оператора
3: ключевым знаком языка Си
4: спецсимвол
Вопрос 61 (10638)
Какой тип данных отсутствует в Си в отличие от большинства других языков:
1: Real
2: Integer
3: String
4: Char
Вопрос 62 (10639)
В языке Си++ тело функции ограничено операторными скобками:
1: begin end
2: start finish
3: []
4: <>
Вопрос 63 (10640)
В языке Си++ программа начинает выполняться с функции:
1: Start
2: Main
3: Go
4: Do
Вопрос 64 (10641)
Идентификатором будет:
1: schetchik get_line a12 Paraml _ab
2: %ab 12abc -x schetchik
3: \b ab 12abc -x schetchik
4: * ab 12abc -x schetchik
Вопрос 65 (10642)
Лидирующий нуль в литералах означает:
1: числовой шестнадцатеричный литерал
2: вещественный десятичный литерал
3: числовой восьмеричный литерал
4: целый десятичный литерал
Вопрос 66 (10643)
Символьным литералом будет:
1: «q»
2: %q
3: «s»
4: «sq»
Вопрос 67 (10644)
Строковым литералом будет
1: «sq»
2: %q
3: «s»
4: «qsqs»
Вопрос 68 (10645)
Оператор INT в Си++ применяется для:
1: переопределения диапазона целых чисел
2: преобразования переменной к целому типу
3: описания переменных целого типа
4: прибавления единицы к коду символа
Вопрос 69 (10646)
Строки в Си++ представляются в виде:
1: множества символов, стоящих в один ряд
2: одного идентификатора
3: массива элементов типа CHAR
4: символического представления ячейки памяти
Вопрос 70 (10647)
Наличие нуль-символа (\0) означает, что:
1: количество ячеек массива должно быть, по крайней мере, на одну больше, чем число символов, которые необходимо размещать в памяти
2: логическим значением переменной является «ложь»
3: количество ячеек массива должно быть на одну меньше, чем число символов, которые необходимо размещать в памяти
4: логическим значением переменной является «истина»
Вопрос 71 (10648)
Пример: val = *ptr; операция косвенной адресации * производит:
1: получение адреса
2: перенаправление адреса переменной val к переменной ptr
3: определение значения, на которое указывает ptr
4: определение значения, на которое указывает valv
Вопрос 72 (10649)
Если в цикле задано два разных условия выхода, то используется оператор:
1: CONTINUE
2: BREAK
3: GOTO
4: NEXT
Вопрос 73 (10650)
Если в выражениях встречаются операнды различных типов, то они преобразуются к общему типу в соответствии с определенными правилами. Если один из операндов имеет тип char, то:
1: другие также преобразуются к типу char и результат имеет тип Char
2: другие преобразуются к типу int и результат имеет тип int
3: во время операции присваивания значение правой части преобразуется к типу левой части, который и становится типом результата
4: остается как есть и результат будет Char
Вопрос 74 (10651)
Метки в операторе Switch должны быть:
1: указателями
2: переменной
3: константой
4: типа Char
Вопрос 75 (10652)
Используя форму обращения Function1 (x), получаем:
1: передачу в функцию значения переменной х
2: передачу адреса переменной х
3: использование глобальной переменной
4: использование класса памяти х
Вопрос 76 (10653)
Используя форму обращения Functionl (&x), получаем:
1: передачу в функцию значения переменной х
2: передачу адреса переменной х
3: использование глобальной переменной
4: использование класса памяти х
Вопрос 77 (10654)
Тип функции определяется:
1: типом ее аргументов
2: использованием в программе
3: типом ее описания
4: типом возвращаемого ею значения
Вопрос 78 (10655)
Автоматические объекты:
1: существуют во время выполнения данного блока и теряют свои значения при выходе из него
2: хранятся вне любой функции, входящей в состав программы, и существуют в течение выполнения всей программы
3: являются объектами статического класса памяти
4: можно инициализировать только выражениями с константами и с указателями на ранее описанные объекты
Вопрос 79 (10656)
Макровызов должен состоять:
1: из списка макросов
2: из списка макропеременных
3: из списка макроимен
4: из макроимени и заключенного, в круглые скобки списка аргументов
Вопрос 80 (10657)
Каков будет результат выполнения операторов:
nrs = 22;
ptr = &nrs;
val = *ptr;
1: присваивание значения 22 переменной ptr
2: &nrs дает адрес переменной val
3: &nrs дает адрес переменной ptr
4: присваивание значения 22 переменной val
Вопрос 81 (10658)
Каков будет результат выполнения операторов:
int i,j,s;
i=j=2; /* i и j получают значение 2 */
s=(i++)+(++j);
1: i= 3,j = 2, s= 5
2: i= 3, j = 3, s = 6
3: i = 3, j = 3, s = 5
4: i = 2, j = 3, s = 5
Вопрос 82 (10659)
Каков будет результат выполнения операторов:
int х,у,а;
х=5;
у=х*2+7;
а=у/4;
1: х = 5, у = 17, а = 4,25
2: х = 5, у = 17, а = 4
3: х = 5, у = 10, а = 2,25
4: х = 5, у = 32, а = 8
Вопрос 83 (10660)
Каков будет результат выполнения операторов:
а=(у=(х=5)*2+7)/4
1: а = 4,25
2: а = 4
3: а = 2,25
4: error
Вопрос 84 (10661)
Каков будет результат выполнения операторов:
int x,y;
х=у=5;
х+=2;
y-=3;
х*=у;
х/=++у;
1: у = 3, х = 4
2: у = 4, х = 12
3: у = 12, х = 12/3
4: у = 3, х = 14
Вопрос 85 (10662)
Каков будет результат выполнения операторов:
int a,b
а = 4;
b=7;
m=(a>b)?a:b;
1: т = 4
2: m = 11
3: т = 3
4: т = 7
Вопрос 86 (10663)
Каков будет результат выполнения операторов:
int х,у
y=-4;
х=(у<0)?-у:у;
1: x = 4
2: х = -4
3: х = 0
4: x: = 8
Вопрос 87 (41969)
Инкапсуляция — это
1: представляет собой механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
2: позволяет использовать в дочерних классах функционал родительского класса и, в случае необходимости, дополнять его
3: представляет собой способность к изменению функционала, унаследованного от базового класса
Вопрос 88 (41970)
Наследование — это
1: представляет собой механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
2: позволяет использовать в дочерних классах функционал родительского класса и, в случае необходимости, дополнять его
3: представляет собой способность к изменению функционала, унаследованного от базового класса
Вопрос 89 (41971)
Полиморфизм — это
1: представляет собой механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
2: позволяет использовать в дочерних классах функционал родительского класса и, в случае необходимости, дополнять его
3: представляет собой способность к изменению функционала, унаследованного от базового класса
Вопрос 90 (41972)
Интерфейс
1: представляет собой набор функций, которые реализуют класс
2: представляет собой описание набора функций
3: представляет собой описание набора функций, которые реализуют класс
4: представляет собой описание набора функций
Вопрос 91 (41973)
Класс является
1: представителем объекта
2: описанием объекта
3: частью объекта
4: реализатором объекта
Вопрос 92 (41974)
Объект является
1: конкретным описанием определенного класса
2: конкретной частью определенного класса
3: производной определенного класса
4: конкретным представителем определенного класса
Вопрос 93 (41975)
Из приведенных утверждений
а) объект является экземпляром определенного класса
б) класс является экземпляром определенного объекта
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 94 (41976)
Поля — это
1: переменные, принадлежащие классу или экземпляру класса
2: процедуры и функции класса
3: синтаксическая надстройка, позволяющая осуществлять в форме вызов функции
4: синтаксическая надстройка, поддерживаемая компилятором и средой Visual Basic, которая позволяет вызывать методы других объектов
Вопрос 95 (41977)
Методы — это
1: переменные, принадлежащие классу или экземпляру класса
2: процедуры и функции класса
3: синтаксическая надстройка, позволяющая осуществлять в форме вызов функции
4: синтаксическая надстройка, поддерживаемая компилятором и средой Visual Basic, которая позволяет вызывать методы других объектов
Вопрос 96 (41978)
Свойства — это
1: переменные, принадлежащие классу или экземпляру класса
2: процедуры и функции класса
3: синтаксическая надстройка, позволяющая осуществлять в форме вызов функции
4: синтаксическая надстройка, поддерживаемая компилятором и средой Visual Basic, которая позволяет вызывать методы других объектов
Вопрос 97 (41979)
События — это
1: переменные, принадлежащие классу или экземпляру класса
2: процедуры и функции класса
3: синтаксическая надстройка, позволяющая осуществлять в форме вызов функции
4: синтаксическая надстройка, поддерживаемая компилятором и средой Visual Basic, которая позволяет вызывать методы других объектов
Вопрос 98 (41980)
Переменные, принадлежащие классу или экземпляру класса — это
1: Поля
Вопрос 99 (41981)
Процедуры и функции класса — это
1: Поля
Вопрос 100 (41982)
Синтаксическая надстройка, позволяющая осуществлять в форме вызов функции — это
1: Поля
2: Методы
3: Свойства
Вопрос 101 (41983)
Синтаксическая надстройка, поддерживаемая компилятором и средой Visual Basic, которая позволяет вызывать методы других объектов — это
1: Поля
Вопрос 102 (41984)
Указатель — это переменная, которая содержит в качестве своего значения _______ другой переменной
1: Значение
Вопрос 103 (41985)
Указатель — это
1: Константа
2: Адрес
3: Переменная
Вопрос 104 (41986)
Целое, которое может быть присвоено указателю, является
1: 0
2: положительным
4: все перечисленное
Вопрос 105 (41987)
Для инициализации указателя можно использовать
1: Значение
2: Адрес
3: Выражение
Вопрос 106 (41988)
Для инициализации указателя можно использовать
1: Любое целое значение
2: Только положительное целое значение
4: Любое целое значение, только не ноль
Вопрос 107 (41989)
Для инициализации указателя можно использовать
1: null
4: все перечисленное
Вопрос 108 (41990)
Из приведенных утверждений
а) Операция взятия адреса может быть применима только к константам, к выражениям, не дающим в качестве результата ссылки, и к переменным, объявленным с классом памяти register.
б) Указатель, объявленный как void, может быть разыменован
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 109 (41991)
Из приведенных утверждений
а) Указатели разных типов нельзя присваивать друг другу без операции приведения типа.
б) Указатель, объявленный как void, может быть разыменован.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 110 (41992)
Что печатается при выполнении оператора? Предполагайте следующие объявления переменных:
char s1[ 50 ] = "jack";
char s2[ 50 ] = "jill";
char s3[ 50 ] , *sptr;
cout << strcpy( s3, s2 ) << endl;
Вопрос 111 (41993)
Что печатается при выполнении оператора? Предполагайте следующие объявления переменных:
char s1[ 50 ] = "jack";
char s2[ 50 ] = "jill";
char s3[ 50 ] , *sptr;
cout << strcat( strcat( strcpy( s3, s1 ) , " and " ), s2 ) << endl;
3: jack and jill
Вопрос 112 (41994)
Что печатается при выполнении оператора? Предполагайте следующие объявления переменных:
char s1[ 50 ] = "jack";
char s2[ 50 ] = "jill";
char s3[ 50 ] , *sptr;
cout << strlen( s1 ) + strlen( s2 ) << endl;
1: 4
2: 8
3: jackjill
4: оператор содержит ошибку
Вопрос 113 (41995)
Из приведенных утверждений
а) Комментарии при выполнении программы вызывают печать компьютером на экране текста после символов //.
б) Если вывод осуществляется в cout, то esc-последовательность \n вызывает перемещение курсора к началу следующей строки на экране.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 114 (41996)
Из приведенных утверждений
а) Все переменные должны быть объявлены до того, как они используются.
б) Всем переменным, когда они объявляются, должен быть присвоен тип.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 115 (41997)
Из приведенных утверждений
а) Объявления в теле функции C++ могут появляться почти везде.
б) C++ рассматривает переменные number и NuMbEr как одинаковые.
1: верно только а
2: верно только б
3: верно только б
4: оба утверждения ложны
Вопрос 116 (41998)
Из приведенных утверждений
а) Операция взятия по модулю (%) может применяться только к целым числам.
б) Все арифметические операции *, /, %, + и — имеют одинаковый уровень приоритета.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 117 (41999)
Из приведенных утверждений
а) Пустые скобки, следующие за именем функции в прототипе, указывают, что функции для выполнения ее задачи не требуется никаких параметров.
б) Тело каждой функции ограничивается левой и правой фигурными скобками ( < и >)
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 118 (42000)
Из приведенных утверждений
а) Программа на C++, которая выводит три строки, должна содержать три оператора вывода, использующих cout.
б) Элементы данных или элемент-функции, объявленные со спецификатором доступа private, доступны для элемент-функций класса, в котором они объявлены.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 119 (42001)
Из приведенных утверждений
а) В соответствии с соглашением, имена функций начинаются с прописной буквы, и все последующие слова в имени также начинаются с прописной буквы.
б) Переменные, объявленные в теле некоторой элемент-функции, называются элементами данных и могут использоваться во всех элемент-функциях класса.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 120 (42002)
Из приведенных утверждений
а) Для исполнения программы можно использовать любой файл исходного кода, содержащий int main().
б) Указатель, объявленный как void, может быть разыменован.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 121 (42003)
Из приведенных утверждений
а) Типы аргументов в вызове функции должны быть согласованы с типами соответствующих параметров в списке параметров прототипа функции.
б) В операторе выбора switch должна быть метка default.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 122 (42004)
Из приведенных утверждений
а) В операторе выбора switch в разделе default требуется оператор break.
б) Выражение, содержащее операцию ||, истинно, если истинны оба операнда этой операции.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 123 (42005)
Из приведенных утверждений
а) Массив может хранить много различный типов данных.
б) Операция взятия адреса может быть применима только к константам, к выражениям, не дающим в качестве результата ссылки, и к переменным, объявленным с классом памяти register.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 124 (42006)
Из приведенных утверждений
а) Если количество начальных значений в списке инициализации меньше, чем количество элементов массива, оставшиеся элементы автоматически получают в качестве начальных значений последние значения из списка инициализации.
б) Если список инициализации содержит начальных значений больше, чем элементов массива, то это — ошибка.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 125 (42007)
Из приведенных утверждений
а) Отдельный элемент массива, который передается функции и модифицируется в этой функции, будет содержать модифицированное значение после завершения выполнения вызываемой функции.
б) Когда исполнение программы приостанавливается в контрольной точке, следующим оператором, который будет исполняться, является оператор после контрольной точки.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 126 (42008)
Из приведенных утверждений
а) Когда значение переменной изменяется, в окнах Autos и Locals оно выделяется желтым цветом.
б) Во время отладки команда Step Out исполняет все оставшиеся операторы текущей функции и возвращает управление в точку, где была вызвана функция.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 127 (42009)
Из приведенных утверждений
а) Указатели разных типов нельзя присваивать друг другу без операции приведения типа.
б) Индексы массива обычно должны иметь тип float.
1: верно только а
2: верно только б
3: верны и а, и б
4: оба утверждения ложны
Вопрос 128 (42010)
Для инициализации указателя можно использовать
10.8 – Знакомство с указателями
В уроке «1.3 – Знакомство с переменными в C++», мы отметили, что переменная – это имя части памяти, которая содержит значение. Когда наша программа создает экземпляр переменной, ей автоматически присваивается адрес свободной памяти, и любое значение, которое мы присваиваем переменной, сохраняется в памяти с этим адресом.
Когда эта инструкция выполняется процессором, будет выделена часть памяти из ОЗУ. В качестве примера предположим, что переменной x присвоена ячейка памяти 140. Всякий раз, когда программа видит переменную x в выражении или инструкции, она знает, что она должна искать значение в ячейке памяти 140.
Что хорошо в переменных, так это то, что нам не нужно беспокоиться о том, какой конкретный адрес памяти назначен. Мы просто ссылаемся на переменную по ее заданному идентификатору, и компилятор переводит это имя в соответствующий адрес памяти.
Однако у этого подхода есть некоторые ограничения, которые мы обсудим в этом и будущих уроках.
Оператор адреса ( & )
Оператор адреса ( & ) позволяет нам увидеть, какой адрес памяти назначен переменной. Это довольно просто:
На машине автора показанная выше программа напечатала:
Примечание. Хотя оператор адреса выглядит так же, как оператор побитового И, их можно различить, поскольку оператор адреса является унарным, тогда как оператор побитового И является бинарным.
Оператор косвенного обращения ( * )
Получение адреса переменной само по себе не очень полезно.
Оператор косвенного обращения ( * ) (также называемый оператором разыменования) позволяет нам получить доступ к значению по определенному адресу:
На машине автора показанная выше программа напечатала:
Примечание. Хотя оператор косвенного обращения выглядит так же, как оператор умножения, вы можете различить их, поскольку оператор косвенного обращения является унарным, а оператор умножения – бинарным.
Указатели
Теперь, когда в наши инструменты добавлены оператор адреса и оператор косвенного обращения, мы можем поговорить об указателях. Указатель – это переменная, которая в качестве значения хранит адрес памяти.
Указатели обычно считаются одной из самых запутанных частей языка C++, но при правильном объяснении они удивительно просты.
Объявление указателя
Переменные-указатели объявляются так же, как обычные переменные, только со звездочкой между типом данных и именем переменной. Обратите внимание, что эта звездочка не является косвенным обращением. Это часть синтаксиса объявления указателя.
Синтаксически C++ принимает звездочку рядом с типом данных, рядом с именем переменной или даже в середине.
Лучшая практика
При объявлении переменной-указателя ставьте звездочку рядом с типом, чтобы его было легче отличить от косвенного обращения.
Как и обычные переменные, указатели не инициализируются при объявлении. Если они не инициализированы значением, они будут содержать мусор.
Одно замечание по номенклатуре указателей: «указатель X» (где X – какой-либо тип) – это обычно используемое сокращение для «указателя на X». Поэтому, когда мы говорим «указатель int », мы на самом деле имеем в виду «указатель на значение типа int ».
Присвоение значения указателю
Поскольку указатели содержат только адреса, когда мы присваиваем значение указателю, это значение должно быть адресом. Одна из самых распространенных вещей, которые делают с указателями, – это хранение в них адреса другой переменной.
Чтобы получить адрес переменной, мы используем оператор адреса:
Концептуально вы можете представить приведенный выше фрагмент так:
Рисунок 1 – Значение, хранимое указателем
Отсюда указатели и получили свое название – ptr (от англ. «pointer», «указатель») содержит адрес значения переменной, поэтому мы говорим, что ptr «указывает на» v .
Это также легко увидеть с помощью кода:
На машине автора эта программа напечатала:
Тип указателя должен соответствовать типу переменной, на которую он указывает:
Обратите внимание, что следующее также некорректно:
Это связано с тем, что указатели могут содержать только адреса, а целочисленный литерал 5 не имеет адреса памяти. Если вы попробуете это сделать, компилятор сообщит вам, что он не может преобразовать int в указатель int .
C++ также не позволит вам напрямую преобразовать литеральные адреса памяти в указатель:
Оператор адреса возвращает указатель
Стоит отметить, что оператор адреса ( & ) не возвращает адрес своего операнда в виде литерала. Вместо этого он возвращает указатель, содержащий адрес операнда, тип которого является производным от аргумента (например, взятие адреса значения int вернет адрес в указателе int ).
Мы можем увидеть это в следующем примере:
В Visual Studio 2013 этот код напечатал:
gcc вместо этого выводит "pi" («pointer to int », указатель на int ).
Затем этот указатель по желанию можно распечатать в консоль или присвоить.
Косвенное обращение через указатели
Когда у нас есть переменная-указатель, указывающая на что-то, другая распространенная вещь, которую мы делаем с ней, – это косвенное обращение через указатель для получения значения того, на что он указывает. Косвенное обращение через указатель вычисляет содержимое адреса, на который он указывает.
На машине автора этот код напечатал:
Вот почему указатели должны иметь тип. Без типа, при косвенном обращении через указатель, указатель не знал бы, как интерпретировать содержимое, на которое он указывает. По этой же причине тип указателя и тип переменной, адрес которой ему присваивается, должны совпадать. Если бы это было не так, косвенное обращение через указатель неверно интерпретировало бы биты как другой тип.
После присваивания значению указателя можно присвоить другое значение:
Когда адрес переменной value присваивается указателю ptr , верно следующее:
- ptr равен &value
- *ptr обрабатывается так же, как value
Поскольку *ptr обрабатывается так же, как value , вы можете присваивать ему значения, как если бы это была переменная value ! Следующая программа напечатает 7:
Предупреждение о косвенном обращении через недействительные указатели
Указатели в C++ по своей сути небезопасны, и неправильное использование указателей – один из лучших способов вывести ваше приложение из строя.
Во время косвенного обращения через указатель приложение пытается перейти в ячейку памяти, которая хранится в указателе, и получить содержимое памяти. В целях безопасности современные операционные системы используют приложения-песочницы, чтобы предотвратить их неправильное взаимодействие с другими приложениями и защитить стабильность самой операционной системы. Если приложение пытается получить доступ к области памяти, не выделенной ему операционной системой, операционная система может завершить работу приложения.
Следующая программа иллюстрирует это и, вероятно, выйдет со сбоем, когда вы запустите ее (попробуйте, вы не навредите своей машине):
Размер указателей
Размер указателя зависит от архитектуры, для которой скомпилирован исполняемый файл – 32-битный исполняемый файл использует 32-битные адреса памяти – следовательно, указатель на 32-битной машине занимает 32 бита (4 байта). С 64-битным исполняемым файлом указатель будет 64-битным (8 байтов). Обратите внимание, что это верно независимо от размера объекта, на который он указывает:
Как видите, размер указателя всегда один и тот же. Это связано с тем, что указатель – это просто адрес памяти, а количество битов, необходимых для доступа к адресу памяти на данной машине, всегда постоянно.
Что хорошего в указателях?
На этом этапе указатели могут показаться немного глупыми, чисто теоретическими или бесполезными. Зачем использовать указатель, если мы можем просто использовать исходную переменную?
Оказывается, указатели полезны во многих разных случаях:
- Массивы реализованы с помощью указателей. Указатели могут использоваться для итерации по массиву (как альтернатива индексам массива) (рассматривается в уроке «10.24 – Введение в итераторы»).
- В C++ это единственный способ динамического выделения памяти (рассматривается в уроке «10.13 – Динамическое выделение памяти с помощью new и delete »). Это, безусловно, наиболее распространенный вариант использования указателей.
- Их можно использовать для передачи функции в качестве параметра другой функции (рассматривается в уроке «11.9 – Указатели на функции»).
- Их можно использовать для достижения полиморфизма при работе с наследованием (рассматривается в уроке «18.1 – Указатели и ссылки базового класса на объекты производных классов»).
- Их можно использовать, чтобы иметь указатель на одну структуру/класс в другой структуре/классе, чтобы сформировать цепочку. Это полезно в некоторых более сложных структурах данных, таких как связанные списки и деревья.
Так что на самом деле существует удивительное количество применений указателей. Но не волнуйтесь, если вы еще не понимаете что-то из этого. Теперь, когда вы на базовом уровне понимаете, что такое указатели, мы можем начать подробно рассматривать различные случаи, в которых они могут быть полезны; что мы и сделаем в следующих уроках.
Заключение
Указатели – это переменные, которые содержат адреса памяти. К значениям, на которые они указывают, можно получить доступ с помощью оператора косвенного обращения ( * ). Косвенное обращение через мусорный указатель вызывает неопределенное поведение.
Небольшой тест
Вопрос 1
Какие значения выводит эта программа? Предположим, что short занимает 2 байта, а машина 32-битная.
Краткое объяснение про 4 и 2. 32-битная машина означает, что указатели будут иметь длину 32 бита, но sizeof() всегда выводит размер в байтах. 32 бита – это 4 байта. Таким образом, sizeof(ptr) равен 4. Поскольку ptr является указателем на short , *ptr – это short . Размер short в этом примере составляет 2 байта. Таким образом, sizeof(*ptr) равен 2.
Вопрос 2
Что не так с этим фрагментом кода?
Последняя строка приведенного выше фрагмента не компилируется.
Разберем эту программу подробнее.
Первая строка содержит определение обычной переменной вместе со значением инициализации. Здесь ничего особенного.
Во второй строке мы определяем новый указатель с именем ptr и сохраняем в нем адрес value . Помните, что в этом контексте звездочка является частью синтаксиса объявления указателя, а не косвенным обращением через указатель. Так что с этой строкой всё в порядке.
В третьей строке звездочка представляет собой косвенное обращение, которое используется для получения значения, на которое указывает указатель. Итак, эта строка говорит: «Получить значение, на которое указывает ptr (целочисленное значение типа int ), и перезаписать его адресом value . В этом нет никакого смысла – вы не можете присвоить адрес значению типа int !
Третья строка должна быть:
Это правильно присваивает указателю адрес переменной value .
Для чего нужен указатель в Си?
![]()
Указатель в Си — это переменная, содержащая адрес другой переменной. Сложность указателей заключается в понимании где и для чего они могут пригодиться.
Перед тем, как я начну рассказывать об указателях и зачем они программистам, быстренько вспомним основы:
Указатель
В Си указателем называется переменная, содержащая адрес другой переменной. Его можно использовать с любым типом данных, написав:
Оператор « & » (амперсанд) определяет адрес переменной, а оператор « * » разыменования позволяет получить значение по адресу, указанным указателем. В примере выше адрес i присваивается к указателю ptr и получается, что ptr указывает на i .
Для чего нужен указатель в Си
Функции в Си принимают аргументы, передавая или копируя значения в стек функции. Такой метод иногда называется передачей по значению. Поскольку функции в Си и переменные, переданные им, в действительности не связываются, любые внесённые изменения в эти переменные не будут сохраняться за пределами действия функции. Это может вызвать сложности, потому что в некоторых функциях необходимо изменять текущие переменные. Здесь-то нам и пригодится указатель. С его помощью можно получить доступ к памяти, находящейся за пределами стекового кадра. Однако важно отметить, что с помощью указателя можно получить доступ лишь к переменным, расположенным ниже текущего кадра.
В примере выше простая функция с задачей — увеличить на единицу число, проходящее через параметры. Функция написана следующим образом:
Однако при запуске кода никаких изменений с переменной не происходит. Связанно это с тем, что в функцию increment (увеличения) копируется только значение переменной, и остальная часть программы не видит изменений, внесённых в эту переменную. Другими словами, переменная i находится внутри функции increment() , и несмотря на одинаковые названия, это не одна и та же переменная, что int i , расположенная за пределами этой функции.
Для того, чтобы решить эту проблему, нужно вместо самой переменной передать в функцию increment указатель этой переменной. Таким образом мы предоставим текущей функции доступ к переменной i , которая не попадает в область действия при выполнении этой функции. Выглядит она вот так: