Вход/Регистрация
Язык Си - руководство для начинающих
вернуться

Д. МАРТИН

Шрифт:

val = *ptr; /* определение значения, на которое указывает ptr */

Последние два оператора, взятые вместе, эквивалентны следующему:

val = bah;

Использование операций получения адреса и косвенной адресации оказывается далеко не прямым путем к результату; отсюда и появление слова "косвенная" в названии операции.

Резюме: операции, связанные с указателями

I. Операция получения адреса &

Когда за этим знаком следует имя переменной, результатом операции является адрес указанной переменной.

Пример:

&nurse дает адрес переменной nurse.

II. Операция косвенной адресации

* Когда за этим таком следует указатель на переменную, результатом операции является величнна, помещенная и ячейку с указанным адресом.

Пример:

nurse = 22;pir = &nurse; /* указатель на nurse */ val = *ptr;

Результатом выполнения этого фрагмента является присваивание значения 22 переменной val.

Описание указателей

Мы знаем, как описывать переменные типа int и других типов. Но как описать переменную типа "указатель"? На первый взгляд это можно сделать так:

pointer ptr; /* неправильный способ описания указателя */

Почему нельзя использовать такую запись? Потому что недостаточно сказать, что некоторая переменная является указателем. Кроме этого, необходимо сообщить еще, на переменную какого типа ссылается данный указатель! Причина заключается в том, что переменные разных типов занимают различное число ячеек, в то время как для некоторых операций, связанных с указателями, требуется знать объем отведенной памяти. Ниже приводятся примеры правильного описания указателей:

int *pi; /* указатель на переменную типа целого */

char *рс; /* указатель на символьную переменную */

float *pf, *pg; /* указатели на переменные с плавающей точкой */

Спецификация типа задает тип переменной, на которую ссылается указатель, а символ звездочка (*) определяет саму переменную как указатель. Описание вида int *pi; говорит, что pi– это указатель и что *pi– величина типа int.

РИС. 9.5. Описание и использование указателей.

Точно так же величина (*рс), на которую ссылается переменна рс, имеет тип char. Что можно сказать о самой переменной рс? Мы считаем, что она имеет тип "указатель на переменную типа char". Ее величина, являющаяся адресом,- это целое число без знака, поэтому при выводе на печать значения переменной рс мы будем пользоваться форматом %u.

Использование указателей для связи между функциями

Мы только прикоснулись к обширному и увлекательному миру указателей. Сейчас нашей целью является использование указателей для решения задачи об установлении связи между функциями. Ниже приводится программа, в которой указатели служат средством, обеспечивающим правильную работу функции, которая осуществляет обмен значениями переменных. Посмотрим, как она выглядит, выполним ее, а затем попытаемся понять, как она работает.

/* обмен3 */

main

{

int x = 5, у = 10;

printf(" Вначале x = %d и у = %d.\n" , x, у);

interchange(&x,&y); /* передача адресов функции */

printf(" Теперь x = %d и у = %d.\n", x, у);

}

interchange(u, v)

int *u, *v; /* u и v являются указателями */

{

int temp; 

temp = *u; /* temp присваивается значение, на которое указывает u */

*u = *v;

*v = temp;

}

После всех встретившихся трудностей, проверим, работает ли этот вариант 1

Вначале x = 5 и y = 10.

Теперь x = 10 и y = 5.

  • Читать дальше
  • 1
  • ...
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: