Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Передача указателей в функции - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Виртуальные функции. Абстрактные классы. http://www.cyberforum.ru/cpp-beginners/thread95698.html
Есть у меня абстрактный класс class DataManager { protected: Configuration configuration; public: DataManager(Configuration config); ...
C++ Описать процедуру, меняющую содержимое переменных X и Y вот тут решил разобраться с языком си, решал задачки и вот напоролся на такую: Описать процедуру Swap(X, Y), меняющую содержимое переменных X и Y. Собстна как сделать такую штуку? http://www.cyberforum.ru/cpp-beginners/thread95683.html
Ввод и вывод вектора C++
Такой вопрос. Программа должна вводить вектор из случайных чисел и выводить его на экран. При этом ввод и вывод нужно оформить в виде отдельных функций. Вопрос же в следующем: если я делаю это всё...
C++ c++ в кпк
Вобщем начну с самого начала. Захотел я изучит c++, до этого работал с php в wap, но так как комп згорел, а на новый щас дениг нет поставил я на кпк pocket gcc и немогу найти инфу по програмированию...
C++ Метод секущих http://www.cyberforum.ru/cpp-beginners/thread95627.html
Помогите, пожалуйста, с кодом к этой программе. 1 Определить координаты экстремальной точки унимодальной функции f(x)=11x2+23x+1,1 методами первого и второго порядков (метод секущих), с точностью ...
C++ Сформировать одномерный массив из элементов матрицы Есть двумерный массив, 5*6 Сформировать одномерный массив, каждый элемент которого равен наибольшему по модулю элементу соответствующего столбца. подробнее

Показать сообщение отдельно
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.02.2010, 10:10
C
1
void func(int n);
такая функция во время своего вызова создаст переменную n и уничтожит её после своего вызова

C
1
void func(int *n);
такая функция во время своего вызова создаст переменную n и уничтожит её после своего вызова

пока переменная существует внутри функции, мы можем читать из неё данные и помещать в неё данные

C
1
void func(int *n);
C
1
    *n = 3;
операция разыменования читает содержимое переменной n
интерпретирует это содержимое как адрес
заменяет выражение *n на область памяти, имеющую этот адрес
записывает в эту область 3

переменная n уничтожится и её данные тоже
но уничтожится просто копия адреса
она была создана во время вызова функции
сначала создалась переменная, потом в неё была помещена копия адреса

C++
1
bool remove(Node **pbeg, Node **pend, int key);
такое применяют, когда хотят изменить содержимое переменных
мы убираем первые звёздочки
C++
1
bool remove(Node *pbeg, Node *pend, int key);
что мы видим
что в функцию будут переданы переменные pbeg и pend, которые обе являются указателями, и key, которая является целым числом
но pbeg и pend, в отличие от key, будут меняться функцией remove

что значит изменить указатель
C
1
2
3
4
5
6
7
8
9
10
    int a, b, *p;
 
    a = 1;
    b = 2;
 
    p = &a; /* записали в переменную p указатель на переменную a */
 
    p = &b; /* записали в переменную p адрес переменной b */
 
    p = NULL; /* записали в переменную p нулевой указатель (void *) 0 */
сперва указатель содержал мусор
потом он стал хранить адрес переменной a
потом он стал хранить адрес переменной b
потом он стал хранить адрес равный нулю данных пустого типа (недоступных данных)

C
1
2
3
4
5
6
    int a; 
    int *b;
    int **c;
    
    b = &a;
    c = &b;
как узнать адрес данных какого типа хранит указатель
мы просто убираем одну здвёздочку

C
1
2
    int b; /* было *b, а стало b */
    int *c; /* было **c, а стало *c */
получилось, что b хранит адрес переменной типа int
а c хранит адрес переменной типа int *
возвращаем звёздочку на место

C
1
2
3
4
5
6
7
8
9
10
    int a; 
    int *b;
    int **c;
 
    a = 1;    
    b = &a;
    c = &b;
    b = *c; /* это равносильно b = b */
    a = **c; /* это равносильно a = a */
    **c = 2; /* это равносильно a = 2 и *b = 2 */
подробно последнюю
C
1
    **c = 2;
разыменовали содержимое переменной c
содержимое переменной c - это адрес переменной b
разыменовав адрес переменной b, мы получили содержимое переменной b
разыменовали содержимое переменной b
содержимое переменной b - это адрес переменной a
разыменовав адрес переменной a, мы получили содержимое переменной a
так как содержимое переменной a стоит в левой части присваивания, в него записывается значение 2
новое содержимое переменной a равно двум

C++
1
2
3
4
        if(pkey == *pbeg){
            *pbeg = (*pbeg)->next; // вот изменение указателя pbeg
            (*pbeg)->prev = 0;
        }
там где *pbeg =
разыменовали содержимое pbeg (remove)
содержимое pbeg (remove) - это адрес pbeg (main)
разыменовав содержимое pbeg (remove), получили содержимое pbeg (main)
так как содержимое переменной pbeg (main) стоит в левой части присваивания, в него записывается значение (*pbeg)->next, это pbeg->next (main)
новое содержимое переменной pbeg (main) равно адресу, который хранится в pbeg->next (main)
голова списка переставляется на следующий элемент
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru