Программирование >>  Процедурные приложения 

1 ... 49 50 51 [ 52 ] 53 54 55 ... 150


Таким образом, переменной 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;

ire3ult a

iresult b

ietemporary

pire suit

□ 5328

[7751] [7Э16] [2335] [1Э20]

Рис. 9.5. В переменную iresult a записывается значение переменной iresult b

В последней строке число, хранящееся в переменной itemporary, просто копируется в переменную iresult b(рис. 9.6).

[7751]

iresult a

iresult b

ietemporary

pire suit

□ 5328

[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).


cswitch2

pcswitchl

1289

[3216]

pcswitch2 pctemporary



Рис. 9.7. Исходные отношения между переменными


cswitchl

cswitch2

pcswitchl

J <k

1289

[12ВЭ] [3216]

[6511]


Рис. 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 сохраняется адрес только первого символа строки. Но это не значит, что оставшаяся часть строки пропадает: компилятор заносит все строковые константы, обнаруженные им в программе, в специальную скрытую таблицу, встраиваемую в программу. Таким образом, в указатель записывается адрес ячейки таблицы, связанной с данной строкой.



1 ... 49 50 51 [ 52 ] 53 54 55 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика