Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Указатели и константы




Fd9c 0.000000

Fd9c 123

Операция приведения типов.

ОПЕРАЦИИ С УКАЗАТЕЛЯМИ

С указателями можно выполнять следующие операции:

1) разыменование (*);

2) присваивание;

3) арифметические операции (сложение с константой, вычитание, инкремент ++, декремент --);

4) сравнение;

5) приведение типов.

Операция разыменования.

 

Пример 50

int a; //переменная типа int

int *pa=new int; //указатель и выделение памяти под динамическую переменную

*pa=10; //присвоили значение динамической переменной, на которую указывает указатель

a=*pa; //присвоили значение переменной а

 

Присваивать значение указателям-константам запрещено.

 

На одну и ту же область памяти могут ссылаться указатели разного типа. Если применить к ним операцию разыменования, то получатся разные результаты.

 

Пример 51

int a=123;

int *pi=&a;

char *pc=(char*)&a;

float *pf=(float*)&a;

printf(«\n%x\t%i»,pi,*pi);

printf(«\n%x\t%c»,pc,*pc);

printf(«\n%x\t%f»,pf,*pf);

При выполнении программы, представленной в примере 51, получатся следующие результаты:

66fd9c {

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

Арифметические операции применимы только к указателям одного типа.

1. Инкремент увеличивает значение указателя на величину sizeof(тип).

 

Пример 52

char *pc;

int *pi;

float *pf;

...

pc++; //значение увеличится на 1

pi++; //значение увеличится на 4

pf++; //значение увеличится на 4

 

2. Декремент уменьшает значение указателя на величину sizeof(тип).

3. Разность двух указателей – это разность их значений, деленная на размер типа в байтах.

4. Суммирование двух указателей не допускается. Можно суммировать указатель и константу.

 

Пример 54

Если p = &v[3]; //указатель p содержит адрес 4-го элемента массива v

то p = p + 2; //указатель p содержит адрес 6-го элемента массива v

 

При записи выражений с указателями требуется обращать внимание на приоритеты операций.

Например:

 

char *p = "asdf"; // обычный указатель

const char *pc ="ghjk "; // указатель на константу

pc[3] = 'a'; // ошибка, pc указывает на константу

pc = p; // нормально

 

Чтобы объявить как константу сам указатель, а не указываемый объект, нужно использовать оператор объявления *const, а не просто const. Кроме того, оператор *const нужно ставить после типа объекта.

Например:

 

char *p = "asdf"; // обычный указатель

char *const сp ="ghjk"; // указатель - константа

сp[3] = 'a'; // нормально

сp = p; // ошибка, указатель сp - константа

 

Чтобы сделать константами и указатель, и объект, надо оба объявить как const, например:

 

char *p = "asdf"; // обычный указатель

const char *const cpc = "asdf"; // указатель-константа и объект -константа

cpc[3] = 'a'; // ошибка

cpc = p; // ошибка

 

 

Указателю на константу можно присвоить адрес переменной, т. к. это не принесет вреда. Однако адрес константы нельзя присвоить указателю без спецификатора const, иначе можно изменить значение объекта. Например:

 

int a = 1;

const int c = 2;

const int *p1 = &c; // нормально

const int *p2 = &a; // нормально

int *p3 = &c; // ошибка, так как возможна следующая инструкция,

*p3 = 7; // меняющая значение c

 

 




Поделиться с друзьями:


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


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



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




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