Переменные-указатели
Адрес — это значение, как и число. Поэтому его можно хранить в переменной. Переменная, в которой хранится адрес, называется указателем: она указывает на другую переменную, то есть говорит, где та лежит.
int age = 15;
int *p = &age;Читайте вторую строку так: «p — указатель на int, и в нём лежит адрес age». Мы говорим, что p указывает на age. Звёздочка * в объявлении говорит, что p — указатель. А int перед ней говорит, какое значение лежит в ячейке, на которую он указывает.
Значит, тип p — это int *, «указатель на int». Указатель на double имеет тип double *, а указатель на char — тип char *. Короткие имена вроде p в небольших примерах для указателей обычны. C не интересуют пробелы вокруг *: int *p, int* p и int * p означают одно и то же. В этом курсе пишется int *p.
Указатель — тоже переменная, поэтому у него есть своя ячейка и свой адрес. Но в этой ячейке лежит не 15, а адрес age. Если вывести p через %p, получится то же число, что и для &age:
#include <stdio.h>
int main(void) {
int age = 15;
int *p = &age;
printf("Адрес age: %p\n", &age);
printf("Значение p: %p\n", p);
return 0;
}Программа выведет:
Адрес age: 0xfffc
Значение p: 0xfffcЧастые ошибки:
int *p = age;без&заканчивается ошибкойincompatible integer to pointer conversion initializing 'int *' with an expression of type 'int'; take the address with &. Указатель хранит адрес, а не число вроде 15. В конце сообщения даже сказано, как исправить: возьмите адрес через&.- Тип указателя должен подходить к типу переменной. После
double price = 9.5;строкаint *p = &price;заканчивается ошибкойincompatible pointer types initializing 'int *' with an expression of type 'double *'. Адресdoubleнужно хранить вdouble *.
Задание
- 1
Ниже переменной
priceсоздайте указательpтипаint *, который указывает наtemperature. - 2
В конце программы (перед
return 0;) выведите значениеpчерез%p: текстЗначение p:иp. Это тот же адрес, что и в первой строке вывода. - 3
Ниже указателя
pсоздайте второй указательq, который указывает наprice(q— обычное имя для второго указателя, ведь буква идёт послеp). Тип выберите сами: значение какого типа хранитprice? Затем в конце программы (передreturn 0;) выведитеЗначение q:иq.