Какво представляват указателите?
В C ++ указателят се отнася до променлива, която съдържа адреса на друга променлива. Подобно на обикновените променливи, указателите имат тип данни. Например, указател от тип integer може да съдържа адреса на променлива от тип integer. Указател от тип символ може да съдържа адреса на променлива от тип символ.
Трябва да видите показалеца като символично представяне на адрес в паметта. С указатели програмите могат да симулират обаждане по препратка. Те също могат да създават и манипулират динамични структури от данни. В C ++ променливата на указателя се отнася до променлива, сочеща към определен адрес в паметта, посочена от друга променлива.
В този урок за C ++ ще научите:
- Какво представляват указателите?
- Адреси в C ++
- Синтаксис на декларация на указател
- Референтен оператор (&) и Deference оператор (*)
- Указатели и масиви
- 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
Референтен оператор (&) и Deference оператор (*)
Референтният оператор (&) връща адреса на променливата.
Операторът за пренасочване (*) ни помага да получим стойността, която е била съхранена в адрес на паметта.
Например:
Ако имаме променлива с име 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.
- Отпечатайте малко текст на конзолата.
- Стойност за печат, съхранена на адреса на указателя.
- Програмата трябва да върне стойност при успешно изпълнение.
- Край на тялото на основната () функция.
Указатели и масиви
Масивите и указателите работят въз основа на свързана концепция. Има различни неща, които трябва да се отбележат при работа с масиви с указатели. Самото име на масива обозначава основния адрес на масива. Това означава, че за да присвоите адреса на масив на указател, не трябва да използвате амперсанд (&).
Например:
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 ще станат еквивалентни.
- Създайте цикъл за. Променливата на цикъла x е създадена за итерация над елементите на масива от индекс 0 до 5.
- Отпечатайте стойностите, съхранени на адреса на указателя IP. Ще се върне една стойност за итерация и ще бъдат направени общо 6 повторения. Endl е ключова дума на C ++, която означава крайния ред. Това действие ви позволява да преместите курсора на следващия ред след отпечатване на всяка стойност. Всяка стойност ще бъде отпечатана в отделен ред.
- За да преместите показалеца в следващата позиция int след всяка итерация.
- Край на цикъла за.
- Програмата трябва да върне нещо при успешно изпълнение.
- Край на тялото на основната () функция.
NULL указател
Ако няма точен адрес, който трябва да бъде присвоен, тогава на променливата на указателя може да бъде присвоено NULL. Това трябва да се направи по време на декларацията. Такъв указател е известен като нулев указател. Стойността му е нула и е дефинирана в много стандартни библиотеки като iostream.
Пример 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Декларирайте променлива ip на указател и му присвойте стойност NULL.
- Отпечатайте стойността на променливата на указателя ip заедно с някакъв текст на конзолата.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на основната () функция.
Указатели на променливи
С C ++ можете да манипулирате данни директно от паметта на компютъра.
Пространството в паметта може да бъде присвоено или преназначено според желанието. Това е възможно чрез променливите на Pointer.
Показалечните променливи сочат към определен адрес в паметта на компютъра, посочен от друга променлива.
Може да се декларира, както следва:
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.
- Задайте адреса на променлива x на p.
- Отпечатайте стойността на променливата на указателя p заедно с някакъв текст на конзолата.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на основната () функция.
Прилагане на указатели
Функциите в 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 (крайният ред) ще премести курсора, за да започне отпечатването в следващия ред.
- Програмата трябва да върне стойност при успешно завършване.
- Край на тялото на основната () функция.
- Определяне на функционалния тест (). Функцията трябва да приема две променливи на целочислени указатели * n1 и * n2.
- Присвояване на променливата на указателя * n1 стойност 10.
- Присвояване на променливата на указателя * n2 стойност 11.
- Край на тялото на функционалния тест ().
Дори Въпреки че, нови стойности се присвояват на променливи a и b вътре във функционалния тест, след като извикването на функцията завърши, същото не се отразява на външната функция main.
Използването на указатели като аргументи на функцията помага да се предаде действителният адрес на променливата във функцията и всички промени, извършени върху променливата, ще бъдат отразени във външната функция.
В горния случай функцията „test“ има адреса на променливите „a“ и „b“. Тези две променливи са директно достъпни от функцията 'test' и следователно всяка промяна, направена на тези променливи, се отразява в функцията за повикване "main".
Предимства на използването на указатели
Тук има плюсове / ползи от използването на указатели
- Указателите са променливи, които съхраняват адреса на други променливи в C ++.
- Повече от една променлива може да бъде модифицирана и върната от функция с помощта на указатели.
- Паметта може да бъде динамично разпределена и разпределена с помощта на указатели.
- Указателите помагат за опростяване на сложността на програмата.
- Скоростта на изпълнение на програма се подобрява чрез използване на указатели.
Резюме:
- Указателят се отнася до променлива, съдържаща адрес на друга променлива.
- Всеки указател има валиден тип данни.
- Показалецът е символично представяне на адрес в паметта.
- Указателите позволяват на програми да симулират обаждане по препратка и да създават и манипулират динамични структури от данни.
- Масивите и указателите използват свързана концепция.
- Името на масива обозначава основата на масива.
- Ако искате да присвоите адреса на масив на указател, не използвайте амперсанд (&).
- Ако няма конкретен адрес за присвояване на променлива на указател, присвойте й NULL.