- •1. Роль указателей в языке с.
- •3. Определение указателя.
- •4. Объявление указателей.
- •5. Операции получения адреса и значения.
- •6. Правила использования основных операций.
- •7. Указатель на переменную и константу.
- •8. Инициализация указателей.
- •1. Присваивание указателю адреса существующего объекта:
- •9. Работа с указателями.
- •Int *pI;
- •Int I, *pI;
- •Int *pI;
- •Int I, *pI;
- •10. Задание, инициализация, вывод переменных и их указателей.
- •11. Ограничения на использование основных
- •12. Указатель константа.
- •13. Константы и ссылки/указатели
- •5 4 2 1 3 // Порядок интерпретации описания
- •16. Многоуровневая адресация
- •17. Операции над указателями.
- •18. Пустой указатель (null-указатель).
- •19. Ввод адреса с клавиатуры.
- •20. Разность значений указателей.
- •14. Присваивание указателей различного типа.
- •22. Явное преобразование типа указателя
- •23. Роль операции sizeof в управлении памятью
- •25. Работа с областью памяти переменного формата
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;