C++ Указатель

Изучение указателей C++ — это одновременно просто и увлекательно. С помощью указателей некоторые задачи программирования на C++ можно упростить, а некоторые задачи, такие как динамическое выделение памяти, невозможно выполнить без указателей. Поэтому, чтобы стать хорошим программистом C++, необходимо изучить указатели.

Как вы знаете, каждая переменная имеет ячейку памяти, и каждая ячейка памяти определяет адрес, доступ к которому можно получить с помощью оператора амперсанда (&), который представляет адрес в памяти. См. следующий пример, который выведет адреса определённых переменных:

Пример

#include <iostream> using namespace std; int main () { int var1; char var2[10]; cout << "Адрес переменной var1:"; cout << &var1 << endl; cout << "Адрес переменной var2:"; cout << &var2 << endl; return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6

На приведённом выше примере мы узнали, что такое адрес памяти и как получить к нему доступ. Теперь давайте посмотрим, что такое указатель.

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

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

type *var-name;

Здесь,typeЭто базовый тип указателя, и он должен быть допустимым типом данных C++.var-name. Первый представляет собой массив, элементы которого являются указателями на int. Второй представляет собой указатель на массив int. При столкновении с такими проблемами читайте изнутри наружу.

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

Фактический тип данных значения всех указателей, будь то целочисленный, с плавающей запятой, символьный или другой тип данных, одинаков: длинное шестнадцатеричное число, представляющее адрес памяти. Единственное различие между указателями разных типов данных — это тип данных переменной или константы, на которую указывает указатель.

Использование указателей в C++

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

Пример

#include <iostream> using namespace std; int main () { int var = 20; // Объявление самой переменной int *ip; // Объявление переменной-указателя ip = &var; // Сохранить адрес var в переменной-указателе cout << "Значение переменной var: "; cout << var << endl; // Вывести адрес, хранящийся в переменной-указателе cout << "Адрес, хранящийся в переменной ip: "; cout << ip << endl; // Доступ к значению по адресу, хранящемуся в указателе cout << "Значение переменной *ip: "; cout << *ip << endl; return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

Подробнее об указателях в C++

В C++ существует множество понятий, связанных с указателями. Эти понятия просты, но все они очень важны. Ниже перечислены некоторые важные понятия, связанные с указателями, которые программисты C++ должны чётко понимать:

КонцепцииОписание
Нулевой указатель C++C++ поддерживает нулевые указатели. NULL-указатель — это константа, определённая в стандартной библиотеке, со значением ноль.
C++ Арифметика указателейНад указателями можно выполнять четыре арифметические операции: ++, --, +, -
Указатели C++ против массивовСуществует тесная связь между указателями и массивами.
Массив указателей в C++Массивы можно определять для хранения указателей.
C++ Указатель на указательC++ допускает указатели на указатели.
Передача указателей в функции в C++Передача параметров по ссылке или по адресу приводит к тому, что переданные параметры изменяются в вызывающей функции.
C++ Возврат указателей из функцийC++ позволяет функциям возвращать указатели на локальные переменные, статические переменные и динамически выделенную память.
Другие расширения