C ++ указатели на примере - PullRequest
0 голосов
/ 08 июня 2010

У меня есть пример кода:

#include <iostream>
#include <conio.h>
using namespace std;

int main ()
{
  int firstvalue = 5, secondvalue = 15;
  int * p1, * p2;

  p1 = &firstvalue;  
  p2 = &secondvalue; 
  cout << "1.p1: " << p1 << ", p2: " << p2 << endl;
  cout << "1.*p1: " << *p1 << ", *p2: " << *p2 << endl;
  *p1 = 10;
  cout << "2.p1: " << p1 << ", p2: " << p2 << endl;
  cout << "2.*p1: " << *p1 << ", *p2: " << *p2 << endl;
  *p2 = *p1; 
  cout << "3.p1: " << p1 << ", p2: " << p2 << endl;
  cout << "3.*p1: " << *p1 << ", *p2: " << *p2 << endl;
  p1 = p2;
  cout << "4.p1: " << p1 << ", p2: " << p2 << endl;
  cout << "4.*p1: " << *p1 << ", *p2: " << *p2 << endl;
  *p1 = 20;          
  cout << "5.p1: " << p1 << ", p2: " << p2 << endl;
  cout << "5.*p1: " << *p1 << ", *p2: " << *p2 << endl;  
  cout << "firstvalue is " << firstvalue << endl;
  cout << "secondvalue is " << secondvalue << endl;
  cout << "firstvalue is " << &firstvalue << endl;
  cout << "secondvalue is " << &secondvalue << endl;

  getch();
    return 0;
}

А вот и вывод:

1.p1: 0041FB40, p2: 0041FB34
1.*p1: 5, *p2: 15
2.p1: 0041FB40, p2: 0041FB34
2.*p1: 10, *p2: 15
3.p1: 0041FB40, p2: 0041FB34
3.*p1: 10, *p2: 10
4.p1: 0041FB34, p2: 0041FB34
4.*p1: 10, *p2: 10
5.p1: 0041FB34, p2: 0041FB34
5.*p1: 20, *p2: 20
firstvalue is 10
secondvalue is 20
firstvalue is 0041FB40
secondvalue is 0041FB34

Что копируется в строку "p1 = p2"? Становится ли p1 ссылкой на p2 или он работает по-другому?

Ответы [ 5 ]

2 голосов
/ 08 июня 2010

Вы просто говорите: «Теперь p1 должен указывать на тот же блок памяти, что и p2».

Таким образом, они начинают указывать на один и тот же блок памяти (на тот же адрес ) и, следовательно, имеют одни и те же значения.

1 голос
/ 08 июня 2010

Поскольку p2 содержит адрес secondvalue, p1=p2; копирует адрес secondvalue из p2 в p1.Я бы посоветовал не называть это ссылкой, если вы можете помочь ей, хотя ссылка - это что-то еще, что достаточно похоже на указатель, чтобы вызвать путаницу в любом случае, так что называть указатель ссылкой (или даже думать о нем как о ссылке)вероятно, плохая идея.

1 голос
/ 08 июня 2010

адрес памяти p1 принимает адрес памяти p2 (0041FB34)

0 голосов
/ 08 июня 2010

= (оператор присваивания) просто копирует значения одной переменной (p2) в другую (p1). Таким образом, после присваивания p1 и p2 являются синонимами в том смысле, что они ссылаются на один и тот же адрес - разыменование их даст такое же значение, как показано в вашей распечатке.

Для получения дополнительной информации, попробуйте эту статью на указатели.

0 голосов
/ 08 июня 2010

После назначения p1 будет содержать тот же адрес памяти, что и p2.Два указателя будут указывать на одну и ту же переменную, поэтому *p1 и *p2 ссылаются на одну и ту же память.

Кроме того, между p1 и p2 нет особой связи.Например, следующее назначение, такое как p1 = &firstvalue, ничего не изменит в переменной-указателе p2, а p1 и p2 снова укажут на другие области памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...