Программирование 07
.pdf
Указатели и адреса
Пусть ip указывает на переменную типа int int i = 5, x = 1, y = 0;
ip = &i;
тогда
y = *ip + x;
эквивалентно y = i + x;
Везде где мы можем использовать переменную определённого типа мы можем использовать указатель этого же типа с операцией ссылки по указателю.
15.10.13
Указатели и адреса
Указатели и сами являются переменными, поэтому их можно использовать и без операции ссылки по указателю.
int i = 5; int *ip, *ip2; ip = &i;
ip2 = ip; /* теперь и ip и ip2 указывают на i */
15.10.13
Указатели и аргументы функций
Поскольку в языке C аргументы в функции передаются по значению (передаются копии), не существует прямого способа изменить значение переменной вызывающей функции из вызываемой.
15.10.13
Указатели и аргументы функций
Давайте попробуем разобраться что произойдёт в этом случае:
void swap(int x, int y)/*НЕПРАВИЛЬНО*/
{
int temp; temp = x; x = y;
y = temp;
}
15.10.13
Указатели и аргументы функций
Правильно будет записать так: void swap(int *px, int *py)
{
int temp; temp = *px; *px = *py; *py = temp;
}
Вызывать её нужно так:
swap(&a, &b); // передаём адреса переменных
Вспоминаем функцию scanf()!
15.10.13
Указатели и аргументы функций
Условно это можно показать так:
15.10.13
Указатели и аргументы функций
Благодаря аргументам-указателям функция может получать доступ к объектам в вызывающей её функции, в том числе модифицировать их.
15.10.13
Указатели и массивы
В языке C связь между указателями и массивами настолько тесная, что рассматривать их можно только вместе.
Пусть у нас есть массив длиной 10 элементов: int a[10];
По сути это блок из 10 последовательных элементов: a[0], a[1] … a[9]
Пусть у нас есть укзатель:
int *pa; // указатель на int
15.10.13
Указатели и массивы
Рассмотрим присваивание: pa = &a[0];
Теперь pa содержит адрес a[0];
15.10.13
Указатели и массивы
Если pa указывает на какой либо элемент массива, то pa+1 указывает на следующий элемент, pa+i — на i-тый после pa, a pa- i на i-тый перед pa:
15.10.13
