Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Начальные сведения об указателях. Выходные параметры функции

Преобразование типа при присваивании

Составной оператор присваивания

Множественное присваивание

Язык Си позволяет в одном выражении присвоить значение нескольким переменным. Такое присваивание называется множественным. Пусть имеются три переменные k, n, и m, имеющие тип int. Тогда допустима следующая инструкция присваивания:

k = n = m = 4;

В результате вычисления приведенного выше выражения все три переменные получат значение, равное 4.

Составной оператор присваивания имеет следующий формат

a @= b

Здесь @ – один из десяти операторов: +, -, *, /, %, <<, >>, &, |, ^.

Программная конструкция

a @= b

полностью эквивалентна программной конструкции

a = a @ b

Приведем ряд примеров. Пусть имеются следующие операторы присваивания, записанные в форме простого присваивания, для которых имеется возможность записать их в форме составного присваивания:

x = x + dx
p = p * i

Эквивалентные этим простым присваиваниям составные присваивания будут иметь следующий вид:

x += dx
p *= i

 

Если при выполнении оператора присваивания тип переменной, стоящей слева от оператора присваивания, не совпадает с типом значения выражения, находящегося справа, то выполняется преобразование типа в соответствии со следующим правилом: тип значения выражения приводится к типу переменной.

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

int main(void)
{
short small;
long big;
float f;
doubl e d;
/* … */
small = big;
f = d;
big = d;
/* … */
}

Все приведенные выше присваивания относятся к разряду потенциально опасных операций, при которых возможна потеря информации. Рассмотрим первое из этих присваиваний: small = big. В этом случае обе переменные имеют целочисленные значения. Однако диапазон значений типа переменной big превосходит диапазон значений переменной small. Действительно, переменная small имеет тип short, а переменная big – тип long. Диапазон значений типа long превосходит диапазон значений типа short. Такие присваивания в языке Си выполняются путем отбрасывания старших разрядов записываемого в переменную значения. Во втором присваивании: f = d переменной типа float присваивается значение типа double. При таком присваивании возможна потеря информации

 

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

Указатели предназначены для работы с адресами. Существуют две разновидности указателей. К первой из них относятся указатели–переменные. Такие указатели предназначены для хранения адресов. Ко второй разновидности относятся указатели–выражения, служащие для вычисления (получения) адресов.

Ограничимся рассмотрением одной категории указателей–выражений, которая используется для получения адреса объекта. Такой вид указателя встречается при работе с функцией scanf(). Пусть x – переменная одного из арифметических типов. Тогда применение к этой переменной унарного оператора взятия адреса & позволяет образовать указатель–выражение следующего вида &x.

Простейший формат объявления указателя–переменной имеет следующий вид

тип_объекта *имя_переменной_указателя

Приведем пример объявления указателя, предназначенного для хранения адресов объектов типа double

double *px;

Указатель – переменную можно инициализировать во время объявления. Такая инициализация выполнена с помощью указателя–выражения в приводимом ниже коде.

double x = 10.5;
double *px = &x;

Здесь &x – указатель – выражение, которое позволяет получить адрес объекта x.

Основным оператором при работе с указателями является унарный оператор разыменования (*). С помощью операции разыменования можно обратиться к объекту, с которым работает указатель (на который установлен указатель.) Приведем пример

double x = 10.5;
double *px = &x;
*px = 10;
printf(“*px=%0.4g\n”, *px);

В этом примере выражение *px используется дважды. Один раз для записи в объект, на который установлен указатель, а второй раз – для чтения.

Полезной является точка зрения, в соответствии с которой указатель – это программный компонент, управляющий доступом к другому программному компоненту. В этом примере с помощью указателя px, получаем доступ к памяти, отведенной для переменной x.

Теперь представим, что указатель px и объект x, с которым указатель работает, принадлежат различным функциям. В этом случае одна функция получает доступ к памяти, выделенной в другой функции. Это дает возможность функции возвращать в точку вызова результаты, полученные в теле вызываемой функции, используя аппарат параметров. Для иллюстрации этой возможности рассмотрим библиотечную функцию modf(), которая используется для извлечения из действительного числа целой и дробной части.

Прототип рассматриваемой функции имеет следующий вид:

#include<math.h>
double modf(double value, double *iptr);

Функция modf() имеет два параметра. С помощью параметра value в функцию передается исходное действительное число. Функция извлекает из переданного числа дробную и целую части. Функция modf() возвращает дробную часть, а целая часть сохраняется в переменной, на которую будет установлен указатель iptr.

Ниже приводится программый код, иллюстрирующий работу рассматриваемой функции.

#include <stdio.h>
#include<math.h>
#include<conio.h>
int main(void)
{
double n, x;
x = modf(10.2, &n);
printf("n= %0.4g x= %0.4g", n, x);
getch();
return 0;
}

В приведенном программном коде, дробная часть исходного числа, которую вернула функция modf(), сохранена функцией main() в переменной x, а целая часть оказалась записанной функцией modf() в переменную n. Протокол работы с рассматриваемой программой, который приведен ниже, подтверждает правильность выполненного анализа:

n= 10 x= 0.2

<== предыдущая лекция | следующая лекция ==>
Простой оператор присваивания | Принятие решений и логические величины. Операторы отношения и сравнения на равенство
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 309; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.