|
Программирование >> Процедурные приложения
Таким образом, переменной itemporary присваивается значение 15 (рис. 9.4). Если перед именем указателя piresult не поставить символ *, то в результате в переменную itemporary будет ошибочно записано содержимое самого указателя, т.е. 5328. Это очень коварная ошибка, поскольку многие компиляторы не выдают в подобных ситуациях предупреждений или сообщений об ошибке. Компилятор VisualC++ отобразит предупреждение вида разные уровни косвенной адресации в операции присваивания . iresult а iresult b ietemporary рire suit Рис. 9.4. Запись в переменную ietemporary значения переменной iresult a В пятой строке содержимое переменной iresult b копируется в ячейку памяти, адресуемую указателем piresult(рис. 9.5): *piresult = iresult b;
[7751] [7Э16] [2335] [1Э20] Рис. 9.5. В переменную iresult a записывается значение переменной iresult b В последней строке число, хранящееся в переменной itemporary, просто копируется в переменную iresult b(рис. 9.6). [7751]
[7Э16] [2335] [1Э20] Рис. 9.6. Конечный результат В следующем фрагменте программы демонстрируется возможность манипулирования адресами, хранящимися в указателях. В отличие от предыдущего примера, где переменные обменивались значениями, здесь осуществляется обмен адресами переменных. char cswitchl = S, cswitch2 = I ; char *pcswitchl, *pcswitch2, *pctemporary; pcswitchl = scswitchl; pcswitch2 = &cswitch2; pctemporary = pcswitchl; pcswitchl = pcswitch2; pcswitch2 = pctemporary; printf( %c%c ,*pcswitchl, *pcswitch2); На рис. 9.7 показана схема отношений межжду зарезервированными ячейками памяти после выполнения первых четырех строк программы. В пятой строке содержимое указателя pcswitchl копируется в переменную pctemporary, в результате чего оба указателя адресуют одну переменную: cswitchl(рис. 9.8).
[3216] pcswitch2 pctemporary Рис. 9.7. Исходные отношения между переменными
Рис. 9.8. Указателю pctemporary присвоен адрес, хранящийся в указателе pcswitch1 В следующей строке содержимое указателя pcswitch2 копируется в указатель pcswitchl, после чего оба будут содержать адрес переменной cswitch2 (рис. 9.9): pcswitchl = pcswitch2; Рис. 9.9. Присвоение указателю pcswitch1 адреса, хранящегося в указателе pcswitch2 Обратите внимание, что если бы содержимое указателя pcswitchl не было продублировано во временной переменной pctemporary, то в результате выполнения предыдущего выражения ссылка на адрес переменной cswitchl была бы утеряна. В предпоследней строке происходит копирование адреса из указателя pctemporary в указатель pcswitch2 (рис. 9.10). В результате работы функции printf() получаем: Рис. 9.10. Передача адреса от указателя pctemporary к указателю pcswitch2 Заметьте: в ходе выполнения программы исходные значения переменных cswitchlи cswitch2 не изменялись. Описанный метод может пригодиться вам в дальнейшем, так как, в зависимости от размеров объектов, часто бывает проще копировать их адреса, чем перемещать содержимое. Инициализация указателей Указатели можно инициализировать при их объявлении, как и любые другие переменные. Например, в следующем фрагменте создаются две именованные ячейки памяти: iresult и piresult. int iresult; int *piresult = &iresult; Идентификатор iresult представляет собой обычную целочисленную переменную, apiresult- указатель на переменную типа int. Одновременно с объявлением указателя piresult ему присваивается адрес переменной iresult. Будьте внимательны: здесь инициализируется содержимое самого указателя, т.е. хранящийся в нем адрес, но не содержимое ячейки памяти, на которую он указывает. Переменная iresult остается неинициализированной. В приведенной ниже программе объявляется и инициализируется указатель на строку-палиндром, одинаково читаемую как слева направо, так и справа налево: * psz.c * Эта программа на языке С содержит пример инициализации указателя. #include <stdio.h> #include <string.h> void main 0 { char *pszpalindrome = Доммод ; int i; for (i = strlen(pszpalindrome) - 1; i >= 0; i-) printf( %c ,pszpalindrome[i]); printf( %s ,pszpalindrome); } В указателе pszpalindrome сохраняется адрес только первого символа строки. Но это не значит, что оставшаяся часть строки пропадает: компилятор заносит все строковые константы, обнаруженные им в программе, в специальную скрытую таблицу, встраиваемую в программу. Таким образом, в указатель записывается адрес ячейки таблицы, связанной с данной строкой.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |