|
Программирование >> Структурное программирование
5.3. Большинство современных компьютеров имеет 2-х или 4-х байтовые целые. Некоторые из более новых машин имеют 8-байтовые целые. Поскольку результат арифметических действий с указателями зависит от размера объектов, на которые указывает указатель, арифметические действия с указателями являются машиннозависимыми. 5.4. Когда переменная типа char* получает в качестве начального значения строковую константу, некоторые компиляторы могут поместить строку в такое место в памяти, где строка не может быть модифицирована. Если у вас может возникнуть необходимость модифицировать строковую константу, она должна храниться в массиве символов, чтобы обеспечить возможность ее модификации во всех системах. 5.5. Внутренний численный код, используемый для представления символов, может быть различным для разных компьютеров (особенно это относится к символам кириллицы). Замечания по технике программирования 5.1. Спецификацию const можно использовать для реализации принципа минимизации привилегий. Использование должным образом принципа минимизации привилегий при проектировании программного обеспечения весьма суш;ественно сокраш;ает время отладки и количество нежелательных побочных эффектов, упрош;ает модификацию и сопровождение программы. 5.2. Если значение не изменяется (или не должно изменяться) в теле функции, которой оно передается, параметр должен быть объявлен как const, чтобы иметь гарантию от неожиданных изменений его. 5.3. При использовании вызова по значению в вызываемой функции можно изменять только одно значение. Это значение должно быть задано как возвраш;аемое в операторе return. Для модификации множества значений в вызываемой функции нужно использовать передачу параметров по ссылке. 5.4. Включение прототипов функции в определения других функций реализует принцип наименьших привилегий путем ограничения вызовов соответствуюш;их функций только теми функциями, в которых появляются соответствующие прототипы. 5.5. При передаче массива в функции передавайте также и размер массива (это предпочтительнее, чем встраивание в функцию знаний о размере массива). Такой подход позволяет создавать функции более общего вида. Функции общего вида часто могут повторно использоваться во многих программах. Упражнения для самопроверки 5.1. Заполнить пробелы в следующих утверждениях: а) Указатель - это переменная, которая содержит в качестве своего значения другой переменной. b) Для присвоения указателю начального значения можно использовать три значения: , или . c) Единственным целым, которое может быть присвоено указателю, является . 5.2. Укажите, справедливы или нет следующие утверждения. Если они ошибочны, укажите почему. a) Операция адресации может быть применима только к константам, к выражениям не имеющим результат, на который можно сослаться, и к переменным, объявленным с классом хранения register. b) Указатель, объявленный как void, может быть разыменован. c) Указатели разных типов нельзя присваивать друг другу без операции приведения типов. 5.3. Выполните следующее упражнение предполагая, что числа с одинарной точностью с плавающей запятой хранятся в 4 байтах и что начальный адрес массива - 1002500. Каждая часть упражнения использует соответствующие результаты предыдущих частей. a) Объявите массив типа float с именем numbers с 10 элементами и присвойте элементам начальные значения 0.0, 1.1, 2.2, 9.9. Предполагайте, что определена символическая константа SIZE, равная 10. b) Объявите указатель nPtr, который указывает на объект типа float. c) Напечатайте элементы массива numbers, используя запись индексов массива. Используйте структуру for и предполагайте, что была объявлена целая управляющая переменная i. Напечатайте каждое число с одной значащей цифрой справа от десятичной точки. d) Приведите два различных оператора, которые присваивают начальный адрес массива numbers переменной указателю nPtr. e) Напечатайте элементы массива numbers, используя указатель nPtr. f) Напечатайте элементы массива numbers, используя запись указатель-смещение с именем массива как указателем. g) Напечатайте элементы массива numbers, используя индексацию указателя nPtr. h) Сошлитесь на элемент 4 массива number, используя запись индекса массива, запись указатель-смещение с именем массива как указателем, запись индекса указателя nPtr и запись указатель-смещение с nPtr. i) Предполагая, что nPtr указывает на начало массива numbers, определите, на какой адрес ссылается выражение nPtr -f- 8? Какое значение хранится по этому адресу? j) Предполагая, что nPtr указывает на numbers[5], определите, на какой адрес будет ссылаться nPtr после выполнения оператора nPtr -= 4. Какое значение хранится по этому адресу? 5.4. Для каждого из следующих пунктов напишите один оператор, который выполняет указанное задание. Предполагайте, что переменные с плавающей запятой numberl и number2 уже объявлены и что numberl получила начальное значение 7.3. Кроме того, предполагайте, что переменная ptr имеет тип char*, а массивы sl[i00] и s2[100] - тип char. a) Объявите переменную fPtr как указатель на объект типа float. b) Присвойте адрес переменной numberl указателю переменной fPtr. c) Напечатайте значение объекта, на который указывает fPtr. d) Присвойте значение объекта, на который указывает fPtr, переменной number 2. e) Напечатайте значение number2. f) Напечатайте адрес numberl. g) Напечатайте адрес, хранимый в fPtr. Совпадает ли напечатанное значение с адресом numberl? h) Скопируйте строку, хранимую в массиве s2, в массив si. i) Сравните строку si со строкой s2. j) Добавьте 10 символов из строки s2 в строку si. к) Определите длину строку si. Напечатайте результат. 1) Присвойте ptr позицию первой лексемы в s2. Лексемы в s2 разделены запятыми (,). 5.5. Проделайте указанное в каждом пункте: a) Напишите заголовок функции exchange, которая получает в качестве параметров два указателя на числа с плавающей запятой х и у и не возвращает никакого значения. b) Напишите прототип функции из пункта а). c) Напишите заголовок функции evaluate, которая возвращает целое и которая получает в качестве параметров целое и указатель на функцию poly. Функция poly получает целый параметр и возвращает целое. d) Напишите прототип функции из пункта с). e) Покажите два разных метода присваивания в качестве начальных условий массиву символов vowel строки гласных AEIOU . 5.6. Найдите ошибку в каждом из следующих фрагментов программ. Полагайте, что int *zPtr; zPtr будет ссылаться на массив z int *aPtr = NULL; void *sPtr = NULL; int number, i; int z[5] = {1, 2, 3, 4, 5}; sPtr = z; a) ++zptr; b) использование указателя для получения первого значения массива number = zPtr; c) присваивание переменной number значения элемента 2 массива (значение 3) number = *zPtr[2];
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |