Перейти к основному содержимому

Что такое указатели?

Определение указателя

Указатель — это переменная, которая хранит адрес другой переменной в памяти компьютера.

int number = 42;         // Обычная переменная
int *ptr = &number; // Указатель на переменную number

Как это работает

Переменные в памяти

#include <stdio.h>

int main() {
int age = 25;

printf("Значение переменной age: %d\n", age);
printf("Адрес переменной age: %p\n", &age);

return 0;
}

Результат:

Значение переменной age: 25
Адрес переменной age: 0x7fff5fbff6ac

Указатель хранит адрес

#include <stdio.h>

int main() {
int score = 100;
int *scorePtr = &score; // Указатель хранит адрес score

printf("=== ЧТО ХРАНИТСЯ ГДЕ ===\n");
printf("score хранит значение: %d\n", score);
printf("scorePtr хранит адрес: %p\n", scorePtr);
printf("По адресу находится: %d\n", *scorePtr);

return 0;
}

Два основных оператора

Оператор адреса (&)

Получает адрес переменной в памяти.

int temperature = 36;
printf("Адрес temperature: %p\n", &temperature);

Оператор разыменования (*)

Получает значение по адресу, на который указывает указатель.

int height = 180;
int *ptr = &height;

printf("Указатель ptr хранит: %p\n", ptr); // Адрес
printf("По этому адресу: %d\n", *ptr); // Значение

Объявление указателей

Синтаксис

тип *имя_указателя;

Примеры объявления

int *integerPointer;     // Указатель на int
float *floatPointer; // Указатель на float
char *characterPointer; // Указатель на char

Простой практический пример

#include <stdio.h>

int main() {
// Создаем переменную
int money = 500;

// Создаем указатель на эту переменную
int *wallet = &money;

printf("В кошельке: %d рублей\n", money);
printf("Кошелек находится по адресу: %p\n", wallet);
printf("В кошельке по этому адресу: %d рублей\n", *wallet);

// Тратим деньги через указатель
*wallet -= 100;

printf("После траты через указатель:\n");
printf("В кошельке осталось: %d рублей\n", money);

return 0;
}

Зачем нужны указатели

  1. Эффективность — передача адреса вместо копирования больших данных
  2. Изменение переменных — функции могут изменять переменные вызывающего кода
  3. Динамическая память — создание структур данных переменного размера
  4. Работа с массивами — эффективный доступ к элементам

Пример с функцией scanf()

#include <stdio.h>

int main() {
int userAge;

printf("Введите возраст: ");
scanf("%d", &userAge); // Передаем АДРЕС переменной

printf("Ваш возраст: %d\n", userAge);

// scanf() получила адрес и записала значение прямо
// в переменную userAge

return 0;
}

Указатель — это просто переменная, которая "показывает" на другую переменную, храня её адрес в памяти.