Форум программистов, компьютерный форум, киберфорум
Наши страницы
outoftime
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Кратко об указателях

Запись от outoftime размещена 14.02.2018 в 21:26

У тебя есть переменная

C++
1
int a = 1;
Она лежит где-то в памяти. Ты можешь взять ее адрес и сохранить этот адрес в другую переменную.

C++
1
int* b = &a;
b имеет значение адреса по которому находится значение переменной a.

Мы можем поменять данные которые лежат по адресу переменной a обратившись к ним разименованием переменной b

C++
1
*b = 2; // a = 2
Еще мы можем сделать еще один указатель на переменную a но уже просто скопировав сам адрес в другую перменную

C++
1
int* c = b;
Переменная c содержит тот же адрес что и перменная b, этот адрес указывает на область памяти где лежат данные переменной a

Что происходит когда вы передаете указатель в функцию? Тоже что и при создании указателя c значение которого это копия указателя b и в случае функций, он является локальной переменной функции.

C++
1
2
3
void do_something(int *c);
// ...
do_something(b);
Для того, чтобы модифицировать указатель b внутри функции, нужно либо передать указатель на указатель b либо передать указатель по ссылке:

C++
1
2
3
4
5
6
7
void do_something(int **c) {
    *c = new int;
}
// или
void do_something(int *&c) {
    c = new int;
}
А вот и полный листинг, продолжайте его читать до тех пор пока не поймете что здесь происходит

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
void do_something(int **c) { *c = new int(3); }
void do_something(int *&c) { c = new int(4); }
 
int main()
{
    int a = 1;
    int *b = &a;
    std::cout << a  << " " << *b << std::endl;
    *b = 2;
    std::cout << a  << " " << *b << std::endl;
    do_something(&b);
    std::cout << a  << " " << *b << std::endl;
    do_something(b);
    std::cout << a  << " " << *b << std::endl;
}
Размещено в C/C++
Просмотров 350 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru