fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5.  
  6.  
  7. int main() {
  8.  
  9. int a = 5;
  10.  
  11. int * ptr_a;
  12.  
  13. ptr_a = &a;
  14.  
  15. int ** ptr_b;
  16.  
  17. ptr_b = &ptr_a;
  18.  
  19. /*
  20.  
  21. Указатель ptr_a;
  22. Синтаксис объявления int * ptr_a;
  23. Указатель это переменная содержащая два значения.
  24. 1. Это сам адресс в памяти, выделенной под этот указатель.
  25. &ptr_a
  26. 2. Это адресс памяти переменной (или массива или указателя или класса) на которую указывает указатель.
  27. ptr_a
  28.  
  29. В данном примере, объявляется и инициализируется переменная а типа int.
  30. Объявляется указатель на int int * ptr_a.
  31. Теперь указателю, который ссылался на случайную память в стеке (причем не инициализированную, значит он ссылался в случайное место) присваевается адресс переменной а. Синтаксис взятия адресса &a.
  32. Объявляется указатель второго порядка int ** ptr_b.
  33. Указателю второго порядка, а точнее значению, которое указывает на область памяти переменной, теперь присваивается значение одласти памяти переменной, на которую указывает указатель ptr_a
  34. напомним
  35. int * ptr - синтаксис объявления указателя
  36. ptr - указатель, при выводе, вывест облась памяти переменной на которую он указывает, что бы получить значение переменной, на область памяти которой указывает указатель, используем разъименовывание указателя cout << *ptr
  37. &ptr - выведет область памяти, выделенной под указатель
  38. именно поэтому, если функция возвращает указатель int * function(){int * ptr; return ptr;} то возвращающим значением должен быть указатель (return ptr) а не (return &prt)
  39. */
  40.  
  41.  
  42.  
  43. std::cout << *ptr_b << std::endl; //вывод значения переменной, на которую указывает указатель второго порядка ptr_b по средствам разъименовывания указателя *ptr_b, указателю второго порядка, а точнее значению, на которое казывает область памяти перемененной, было присвоино значение области памяти выделенной под указатель первого порядка
  44. std::cout << ptr_a << std::endl; //
  45. std::cout << &ptr_a << std::endl;
  46. std::cout << &a << std::endl;
  47.  
  48. system("pause");
  49. return 0;
  50. }
  51.  
Success #stdin #stdout #stderr 0s 3468KB
stdin
Standard input is empty
stdout
0xfffce5b8
0xfffce5b8
0xfffce5bc
0xfffce5b8
stderr
sh: 1: pause: not found