Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
17.04.2015
Размер:
78.15 Кб
Скачать

9. Работа с указателями.

Указатели можно:

Объявить:

char *pC;

Int *pI;

float *pF;

Указатели объявляются в списке переменных,но перед их именем ста-вится знак *. Указатель всегда указывает на переменную того типа, для которого он был объявлен. Например, pC может указывать на лю-бой символ, pI – на любое целое число,а pF – на любое вещественное число.

Присвоить адрес:

Int I, *pI;

...

pI = &i;

Такая запись означает: «записать в указатель pI адрес переменной i». Запись &i обозначает адрес переменной i.

Получить значение по этому адресу:

float f , *pF;

...

f = *pF;

Такая запись означает: «записать в переменную f то вещественное число, на которое указывает указатель pF». Запись *pF обозначает содержимое ячейки, на которую указывает pF.

Сдвинуть:

Int *pI;

...

pI ++;

pI += 4;

-- pI;

pI -= 4;

В результате этих операций значение указателя меняется особым способом: pI++ сдвигает указатель на РАЗМЕР ЦЕЛОГО ЧИСЛА, то есть на 4 байта, а не на 1 как можно подумать.А запись pI+=4 или pI=pI+4 сдвигает указатель на 4 целых числа дальше, то есть на 16 байт.

Обнулить:

char *pC;

...

pC = NULL;

Если указатель равен нулевому адресу NULL, это обычно означает, что указатель недействительный. По нему нельзя ничего записывать (это вызывает сбой программы компьютера).

Вывести на экран:

Int I, *pI;

...

pI = &i;

printf("Адр.i =%p", pI);

Для вывода указателей используется формат %p или %u.

10. Задание, инициализация, вывод переменных и их указателей.

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

int main()

{

int i1,i2;

int *pi1,*pi2;

pi1=&i1;

pi2=&i2;

printf(«Содержание i1=%i Адрес i1=%u Содержание i2=%i Адрес i2=%u\n",i1,pi1,i2,pi2);

char c1,c2;

char *pc1,*pc2;

pc1=&c1;

pc2=&c2;

printf("Содержание c1=%c Адрес c1=%u Содержание c2=%c Адрес c2=%u\n",c1,pc1,c2,pc2);

float f1,f2;

float *pf1,*pf2;

pf1=&f1;

pf2=&f2;

printf("Содержание f1=%f Адрес c1=%u Содержание f2=%f Адрес f2=%u\n",f1,pf1,f2,pf2);

system("pause");

return 0;

}

//i1=2001378868 pi1=2686788 i2=26866792 pi2=2686784

//c1= pc1=2686775 c2=T pc2=2686774

//f1=0.0000 pf1=2686760 f2=0.000 pf2=2686756

Сам указатель содержит адрес нулевого байта этой переменной, а тип адресуемой переменной определяет, сколько байтов, начиная с нулевого (адреса, определённого указателем) занимает это значение.

11. Ограничения на использование основных

операций над указателями.

В то же время будет ошибкой запись типа *234=var1;

так как в левой части оператора присваивания записывается адрес константы. Но константа в Си не имеет адреса в памяти.

Существуют ограничения и на использование операции взятия адреса &:

1) нельзя определить адрес константы, например, некорректным является выражение var1=&0xff00;

2) нельзя определить адрес значения, получаемого при выполнении арифметического выражения, включающего знаки +, -, /, * и т. п. Например, некорректным является выражение

int var1, *ptr;

pt=&( var1 *3);

3) нельзя определить адрес переменной, описанной как register. Например, будет ошибкой попытка определить адрес varl:

unsigned register var1;

unsigned int * ptr;