Что такое указатели?
В C ++ указатель относится к переменной, которая содержит адрес другой переменной. Как и обычные переменные, указатели имеют тип данных. Например, указатель целочисленного типа может содержать адрес переменной целочисленного типа. Указатель символьного типа может содержать адрес переменной символьного типа.
Вы должны увидеть указатель как символическое представление адреса памяти. С помощью указателей программы могут имитировать вызов по ссылке. Они также могут создавать динамические структуры данных и управлять ими. В C ++ переменная-указатель относится к переменной, указывающей на конкретный адрес в памяти, на которую указывает другая переменная.
В этом руководстве по C ++ вы узнаете:
- Что такое указатели?
- Адреса в C ++
- Синтаксис объявления указателя
- Оператор ссылки (&) и оператор уважения (*)
- Указатели и массивы
- NULL указатель
- Указатели переменных
- Применение указателей
- Преимущества использования указателей
Адреса в C ++
Чтобы понять указатели C ++, вы должны понимать, как компьютеры хранят данные.
Когда вы создаете переменную в своей программе на C ++, ей выделяется место в памяти компьютера. Значение этой переменной сохраняется в назначенном месте.
Чтобы узнать место в памяти компьютера, где хранятся данные, C ++ предоставляет оператор & (ссылка). Оператор возвращает адрес, который занимает переменная.
Например, если x - переменная, & x возвращает адрес переменной.
Синтаксис объявления указателя
Объявление C ++ имеет следующий синтаксис:
datatype *variable_name;
- Тип данных - это базовый тип указателя, который должен быть допустимым типом данных C ++.
- Имя_переменной должно быть именем переменной-указателя.
- Звездочка, использованная выше для объявления указателя, аналогична звездочке, используемой для выполнения операции умножения. Это звездочка, которая отмечает переменную как указатель.
Вот пример правильного объявления указателя в C ++:
int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character
Оператор ссылки (&) и оператор уважения (*)
Оператор ссылки (&) возвращает адрес переменной.
Оператор разыменования (*) помогает нам получить значение, которое было сохранено в адресе памяти.
Например:
Если у нас есть переменная с именем num, хранящаяся по адресу 0x234 и хранящая значение 28.
Ссылочный оператор (&) вернет 0x234.
Оператор разыменования (*) вернет 5.
Пример 1:
#includeusing namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}
Выход:
Как это работает:
Вот скриншот кода:
Пояснение к коду:
- Импортируйте файл заголовка iostream. Это позволит нам использовать функции, определенные в файле заголовка, без ошибок.
- Включите пространство имен std, чтобы использовать его классы, не вызывая его.
- Вызовите функцию main (). Логика программы должна быть добавлена в тело этой функции. {Отмечает начало тела функции.
- Объявите целочисленную переменную x и присвойте ей значение 27.
- Объявить указатель переменной * ip.
- Сохраните адрес переменной x в переменной-указателе.
- Напечатайте текст на консоли.
- Выведите на экран значение переменной x.
- Напечатайте текст на консоли.
- Выведите адрес переменной x. Значение адреса хранилось в переменной ip.
- Напечатайте текст на консоли.
- Вывести значение, хранящееся по адресу указателя.
- Программа должна вернуть значение при успешном выполнении.
- Конец тела функции main ().
Указатели и массивы
Массивы и указатели работают на основе связанной концепции. При работе с массивами, имеющими указатели, следует учитывать разные моменты. Само имя массива обозначает базовый адрес массива. Это означает, что для присвоения адреса массива указателю не следует использовать амперсанд (&).
Например:
p = arr;
Вышеупомянутое верно, поскольку arr представляет адрес массивов. Вот еще один пример:
p = &arr;
Вышесказанное неверно.
Мы можем неявно преобразовать массив в указатель. Например:
int arr [20];int * ip;
Ниже приведена допустимая операция:
ip = arr;
После вышеуказанного объявления ip и arr будут эквивалентны, и у них будут общие свойства. Однако ip может быть назначен другой адрес, но мы не можем ничего присвоить arr.
Пример 2:
В этом примере показано, как обходить массив с помощью указателей:
#includeusing namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Объявить целочисленную переменную указателя ip.
- Объявите массив с именем arr и сохраните в нем 6 целых чисел.
- Назначьте arr ip. IP и arr станут эквивалентными.
- Создайте цикл for. Переменная цикла x была создана для перебора элементов массива от индекса 0 до 5.
- Вывести значения, хранящиеся по адресу указателя IP. На итерацию будет возвращено одно значение, всего будет выполнено 6 повторений. Endl - это ключевое слово C ++, обозначающее конечную строку. Это действие позволяет перемещать курсор на следующую строку после печати каждого значения. Каждое значение будет напечатано в отдельной строке.
- Чтобы переместить указатель на следующую позицию int после каждой итерации.
- Конец цикла.
- Программа должна что-то вернуть после успешного выполнения.
- Конец тела функции main ().
NULL указатель
Если нет точного адреса, который должен быть назначен, то переменной-указателю может быть присвоено значение NULL. Это нужно сделать при декларировании. Такой указатель называется нулевым указателем. Его значение равно нулю и определено во многих стандартных библиотеках, таких как iostream.
Пример 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Объявите переменную указателя ip и присвойте ей значение NULL.
- Напечатайте значение переменной указателя ip рядом с текстом на консоли.
- Программа должна вернуть значение после успешного завершения.
- Конец тела функции main ().
Указатели переменных
С помощью C ++ вы можете управлять данными прямо из памяти компьютера.
Пространство памяти может быть назначено или переназначено по желанию. Это стало возможным благодаря переменным указателя.
Переменные-указатели указывают на конкретный адрес в памяти компьютера, на который указывает другая переменная.
Его можно объявить следующим образом:
int *p;
Или же,
int* p;
В вашем примере мы объявили переменную указателя p.
Он будет содержать адрес памяти.
Звездочка - это оператор разыменования, означающий указатель на.
Указатель p указывает на целое число в адресе памяти.
Пример 4:
#includeusing namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Объявите переменную-указатель p и переменную x со значением 30.
- Присвойте p адрес переменной x.
- Напечатайте значение переменной-указателя p рядом с текстом на консоли.
- Программа должна вернуть значение после успешного завершения.
- Конец тела функции main ().
Применение указателей
Функции в C ++ могут возвращать только одно значение. Кроме того, все переменные, объявленные в функции, размещаются в стеке вызовов функции. Как только функция возвращается, все переменные стека уничтожаются.
Аргументы функции передаются по значению, и любая модификация переменных не меняет значения фактических передаваемых переменных. Следующий пример помогает проиллюстрировать эту концепцию: -
Пример 5:
#includeusing namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Создайте прототип функции с именем test, которая будет принимать два целочисленных параметра.
- Вызовите функцию main (). Мы добавим логику программы внутрь ее тела.
- Объявите две целочисленные переменные a и b, каждая со значением 5.
- Напечатайте текст на консоли. Endl (конечная строка) переместит курсор, чтобы начать печать со следующей строки.
- Напечатайте значение переменной a на консоли рядом с другим текстом. Endl (конечная строка) переместит курсор, чтобы начать печать со следующей строки.
- Напечатайте значение переменной b на консоли рядом с другим текстом. Endl (конечная строка) переместит курсор, чтобы начать печать со следующей строки.
- Создайте функцию с именем test (), которая принимает в качестве параметров адреса переменных a и b.
- Напечатайте текст на консоли. \ N создаст новую пустую строку перед печатью текста. Endl (конечная строка) переместит курсор, чтобы начать печать в следующей строке после печати текста.
- Напечатайте значение переменной a на консоли рядом с другим текстом. Endl (конечная строка) переместит курсор, чтобы начать печать со следующей строки.
- Напечатайте значение переменной b на консоли рядом с другим текстом. Endl (конечная строка) переместит курсор, чтобы начать печать со следующей строки.
- Программа должна вернуть значение после успешного завершения.
- Конец тела функции main ().
- Определение функции test (). Функция должна принимать две целочисленные переменные-указатели * n1 и * n2.
- Присваиваем переменной-указателю * n1 значение 10.
- Присваиваем переменной-указателю * n2 значение 11.
- Конец тела функции test ().
Даже несмотря на то, что новые значения присваиваются переменным a и b внутри функционального теста, после завершения вызова функции это не отражается на внешней функции main.
Использование указателей в качестве аргументов функции помогает передать фактический адрес переменной в функцию, и все изменения, выполненные с переменной, будут отражены во внешней функции.
В приведенном выше случае функция «test» имеет адрес переменных «a» и «b». Эти две переменные доступны напрямую из функции test, и, следовательно, любые изменения, внесенные в эти переменные, отражаются в вызывающей функции main.
Преимущества использования указателей
Вот плюсы / преимущества использования указателей
- Указатели - это переменные, которые хранят адреса других переменных в C ++.
- Функция может изменять и возвращать несколько переменных с помощью указателей.
- Память можно динамически выделять и отменять с помощью указателей.
- Указатели помогают упростить сложность программы.
- Скорость выполнения программы повышается за счет использования указателей.
Резюме:
- Указатель относится к адресу хранения переменной другой переменной.
- Каждый указатель имеет допустимый тип данных.
- Указатель - это символическое представление адреса памяти.
- Указатели позволяют программам моделировать вызов по ссылке, а также создавать динамические структуры данных и управлять ими.
- Массивы и указатели используют связанную концепцию.
- Имя массива обозначает базу массива.
- Если вы хотите присвоить адрес массива указателю, не используйте амперсанд (&).
- Если нет конкретного адреса для присвоения переменной-указателя, присвойте ей NULL.