Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Мастерство константных указателей и указателей на константы в C

В C указатель — переменная, хранящая адрес памяти другой переменной, а ключевое слово const используется для определения переменной или указателя, значение которого нельзя изменить после инициализации. Когда мы комбинируем указатели с ключевым словом const, мы можем контролировать две вещи —

В этой главе мы рассмотрим три основные вариации константных указателей —

Константный указатель (Constant Pointer)

Константный указатель означает, что сам указатель является константой. После инициализации указанием на область памяти он не может указывать на другую область, но значение, хранимое в этой области, всё ещё можно изменить.

Ниже приведён синтаксис константного указателя —

data_type *const pointer_name = &variable;

В этом синтаксисе data_type — тип данных, на которые указывает указатель, *const делает сам указатель константным, pointer_name — имя указателя, а &variable присваивает ему адрес памяти переменной.

Пример константного указателя

В этом примере мы объявляем константный указатель ptr и инициализируем его адресом переменной x. Затем мы меняем значение x с помощью ptr и печатаем его.

#include <stdio.h>
int main() {
    int x = 10;
    int y = 20;
    int *const ptr = &x; // константный указатель на int
    printf("Value of x: %d\n", *ptr);
    *ptr = 15; // можно изменить значение по адресу
    printf("Modified value of x: %d\n", *ptr);
    // ptr = &y; // изменение адреса указателя не допускается
    return 0;
}

Ниже показан вывод вышеуказанной программы, демонстрирующий, что указатель остаётся зафиксированным на x, но значение x можно обновить.

Value of x: 10
Modified value of x: 15

Пример ошибки константного указателя

Здесь пример, где мы объявляем константный указатель ptr и инициализируем его адресом переменной x. Затем пытаемся заставить его указывать на адрес переменной y. Это вызовет ошибку, потому что константный указатель не может указывать на другую область памяти после инициализации.

#include <stdio.h>
int main() {
    int x = 10;
    int y = 20;
    int *const ptr = &x; // константный указатель на int
    printf("Value of x: %d\n", *ptr);
    // Попытка изменить указатель на y
    ptr = &y; // нельзя изменить адрес константного указателя
    return 0;
}

Вы можете увидеть ошибку ниже, указывающую на то, что мы не можем изменить адрес константного указателя.

error: assignment of read-only variable 'ptr'

Указатель на константу (Pointer to Constant)

Указатель на константу означает, что значение, на которое он указывает, нельзя изменить, но сам указатель может указывать на разные адреса памяти (или переменные).

Ниже приведён синтаксис для указателя на константу —

const data_type *pointer_name = &variable;
data_type const *pointer = &variable;

В этом синтаксисе const data_type или data_type const означает, что указатель указывает на константное значение, pointer_name — имя указателя, а &variable присваивает ему адрес переменной.

Пример указателя на константу

В этом примере мы объявляем указатель ptr, указывающий на константное значение, и присваиваем ему адрес переменной a. Затем заставляем указатель указывать на другой адрес переменной b и печатаем его значение.

#include <stdio.h>
int main() {
    int a = 5;
    int b = 30;
    const int *ptr = &a; // указатель на константный int
    printf("Value of a: %d\n", *ptr);
    // *ptr = 10; // мы не можем изменить значение через указатель
    ptr = &b; // изменение адреса указателя
    printf("Now pointing to b: %d\n", *ptr);
    return 0;
}

Ниже приведён вывод вышеуказанной программы, показывающий тот же указатель, указывающий на разные переменные.

Value of a: 5
Now pointing to b: 30

Пример ошибки указателя на константу

Здесь пример, где мы объявляем указатель на константу ptr и инициализируем его адресом переменной a. Затем пытаемся изменить значение a через указатель. Это вызовет ошибку, потому что указатель на константу не позволяет модифицировать значение, на которое он указывает.

#include <stdio.h>
int main() {
    int a = 5;
    const int *ptr = &a; // указатель на константный int
    printf("Value of a: %d\n", *ptr);
    // мы не можем изменить значение через указатель на константу
    *ptr = 10;
    return 0;
}

Ниже вы можете увидеть вывод, показывающий ошибку, указывающую на то, что мы не можем модифицировать значение через указатель на константу.

error: assignment of read-only location '*ptr'

Константный указатель на константу (Constant Pointer to Constant)

Константный указатель на константу — это указатель, который не может изменить свой адрес памяти, и значение, хранимое по этому адресу, также нельзя изменить. Оба действия ограничены, поэтому мы можем только читать значение, больше ничего.

Ниже приведён синтаксис для константного указателя на константу —

const data_type *const pointer_name = &variable;

В этом синтаксисе —

Пример константного указателя на константу

В этом примере мы объявляем константный указатель на константу ptr и присваиваем ему адрес памяти переменной a. Затем печатаем значение a с помощью указателя.

#include <stdio.h>
int main() {
    int a = 10;
    const int *const ptr = &a; // константный указатель на константу
    printf("Value of a: %d\n", *ptr);
    // *ptr = 15; // мы не можем изменить значение
    // ptr = &b; // мы не можем изменить адрес указателя
    return 0;
}

Ниже приведён вывод вышеуказанной программы —

Value of a: 10

Пример ошибки константного указателя на константу

В этом примере мы объявляем константный указатель на константу ptr и инициализируем его переменной a. Затем пытаемся изменить значение через указатель и также заставить указатель указывать на другую переменную. Обе операции недопустимы и приведут к ошибке компиляции.

#include <stdio.h>
int main() {
    int a = 10;
    int b = 20;
    const int *const ptr = &a; // константный указатель на константу
    printf("Value of a: %d\n", *ptr);
    // *ptr = 15; // мы не можем изменить значение
    // ptr = &b; // мы не можем изменить адрес указателя
    return 0;
}

Ниже вы можете увидеть вывод, показывающий ошибки —

Value of a: 10

Различия между типами константных указателей

Следующая таблица показывает различия между константным указателем, указателем на константу и константным указателем на константу.

Вариация Определение Может изменить адрес? Может изменить значение? Пример синтаксиса
Константный указатель Указатель, чей адрес фиксирован, но значение по этому адресу можно модифицировать. Нет Да int *const p = &x;
Указатель на константу Указатель, который может указывать на разные адреса, но не может модифицировать значение по адресу. Да Нет const int *p = &x;
Константный указатель на константу Указатель, чей адрес фиксирован, и значение по этому адресу нельзя модифицировать. Нет Нет const int *const p = &x;

Заключение

В этой главе мы рассмотрели константные указатели и указатели на константы в C. Константные указатели фиксируют адрес, но позволяют менять значение, указатели на константу позволяют менять адрес, но не значение, а константные указатели на константу ограничивают оба действия.

Язык C

  1. Коллекции в C#: практическое руководство с реальными примерами
  2. Классы хранения в C: auto, register, static, extern — область видимости и время жизни
  3. Освоение указателей в C: практическое руководство от экспертов
  4. Веб-программирование на C++ с CGI: полное руководство
  5. Топ-50 вопросов для собеседования по C# с ответами (2021) – для новичков и опытных разработчиков
  6. Освоение функции free() в C: практическое руководство и пример
  7. Индексаторы в C#: делаем объекты доступными как массивы
  8. Наследование в C++: создание мощных классов с повторным использованием кода
  9. Частичные классы и методы в C#: понимание и применение
  10. Циклы while и do-while в C++: освоение повторений в коде