Переменные, в которых хранятся адреса других переменных, называются указателями.
Указатель – переменная, диапазон значений которой состоит из адресов
ячеек памяти или специального значения — нулевого адреса.
Последнее используется для указания того, что в данный момент указатель
не ссылается ни на одну из допустимых ячеек.
Справочная служба 109.
Адрес – указатель, номер телефона – значение переменной.
Результат: при изменении номера нет необходимости оповещать об этом всех абонентов.
Расчетный счет.
Счет не меняется, а содержимое – сколько угодно.
Результат: достаточно помнить номер счета или карты.
Файловый указатель.
Один и тот же указатель обращается всякий раз к текущему элементу файла, после чего перемещается на следующий.
Результат: через один указатель можно работать с различными данными, находящимися в файле
Примеры:
Однако указатель может вызвать и ряд затруднений:
если указатель содержит неправильное значение, программа может быть неработоспособной (access violation).
можно легко ошибиться при использовании указателей;
ошибки, связанные с неправильными значениями указателей, найти очень трудно.
Общая форма объявления указателя:
тип * имя;
int *р; // р – указатель на int
int *р, q; // q – не указатель
int *р, *q; // p и q – указатели
P = NULL; // пустой (нулевой) указатель
void* p; // бестиповый указатель
Нулевой указатель − это указатель, хранящий специальное значение, используемое для того, чтобы показать, что данная переменная-указатель не ссылается (не указывает) ни на какой объект (в С и С++ - это 0 или макрос NULL - нулевой адрес, зарезервирован ОС).
void используется для того, чтобы показать, что указатель означает просто адрес памяти, независимо от типа величины, находящейся по этому адресу
void *UndefPoint;
UndefPoint = 0xb8000000; // недопустимо
UndefPoint++; // Для типа void * нет такой операции…
(int *)UndefPoint++; // И так тоже ничего не получается…
((int *)UndefPoint)++; // А так хорошо… Сколько скобок!
++(int *)UndefPoint; // И вот так тоже хорошо…
Приведение типов указателей
long array[100];
long sum = 0;
for (long* ptr = &array[0]; ptr < &array[99] + 1; ptr++)
sum += *ptr;
//или
for (long* ptr = array; ptr < &array[99] + 1; ptr++)
sum += *ptr;
Смешивать указатели и массивы можно, делать это не рекомендуется!
Использование указателей, а не массивов с фиксированными размерами, особенно целесообразно, когда предложения или слова должны быть разной длины.
char *point[]={"понедельник","вторник",
"среда","четверг", "пятница","суббота",
"воскресенье"};
int i,n;
n=sizeof(point)/sizeof(point[0]);
for(i=0;i < n;i++) {
printf("\n %s",point[i]); // 1)
printf("\n %p",point[i]); // 2)
}
понедельник
вторник
среда
четверг
пятница
суббота
воскресенье
00B8
00C4
00CC
00D2
00DA
00E2
00EA
1)
2)
1)
2)
void main() {
positive(int *m);
int k=-3;
positive(&k);
printf("\n k=%d",k);
getch();}
void positive(int *m){
if (*m < 0)
*m=-*m;
}
Если в качестве параметра функции используется обозначение массива, то на самом деле внутрь функции передаётся только адрес начала массива, а значит внутри функции можно изменять значения элементов такого массива.
Программа выведет '3'. Если в объявлении 'f' убрать & перед a, то программа выведет 4. Плюс ссылок - не надо пользоваться разыменовыванием (оператор *) и взятием адреса (оператор &). Минус - обязательно надо на что-нибудь ссылаться, то есть нельзя передать NULL как ссылку
int a; // переменная типа int
int &b = a; // ссылка на a
void f(int &a)
{
a = 3;
}
void main()
{
int k = 4;
f(k);
printf("%d\n",k);
}
Ссылка - псевдоним объекта, скрытая форма указателя, который при использовании автоматически разыменовывается.
Ссылка должна быть обязательно проинициализирована сразу при объявлении.
Любое изменение значения ссылки повлечет за собой изменение того объекта, на который данная ссылка указывает.
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть