2014-11-04 4 views
2

У меня есть следующая структура для узла в связанном списке.Разница между C++ между адресом

struct node { 
    int info; 
    nod *next; 
}; 

Я объявил p указателем на структуру (узел) и инициализировал ее.

node *p = new node; 

Я не понимаю разницу между p и &p, они 2 адреса, но не должны их иметь один и тот же адрес?

cout<<p<<" "<<&p; 
+5

p -> адрес узла, & p -> адрес указателя на узел. – Borgleader

+1

Если вы подходите к дому и направляют вас в другой дом, считаете ли вы, что эти два дома являются одним и тем же домом? – chris

+1

& p обозначает адрес переменной, содержащий другой адрес. – piotrekg2

ответ

-2

В C++ вы используете & перед poiner, если вы хотите написать переменную ему или лучше сказать: пусть точка указатель на адрес причины & дает адрес в вар.

int i = 0; 
int* pointer = &i; 

Если вы хотите использовать континент переменной, указатель указывает на то, что вы относитесь к нему с помощью *.

int y = *i; 

основно р является указателем узла и & р это адрес указателя узла.

р имеет свой собственный адрес, в Примеру, если вы хотите другой указатель, чтобы указать на р, который указывает на узел вы делаете Foo secondpointer = & р

4

Давайте посмотрим на это немного по-другому:

struct node { 
    int info; 
    node *next; 
}; 

node n; // the node itself 

node* p = &n; // p is a "node pointer" (node*) 
       // its value holds the address of (node) n 

node** pp = &p; // pp is a pointer to a "node pointer" (node**) 
       // its value holds the address of (node*) p 

Означает ли это, что это немного яснее?

1

Итак, давайте простой пример, чтобы разработать это: -

int x = 4; 

Через этот 4 будут сохранены в памяти, созданной для размера междунар. Этот кусок памяти называется переменной x в вашей программе. Предположим, что адрес памяти ADDRESS_1.

int *ptr = &x; 

С помощью этого заявления другого куска памяти создается с размером указателя (то же самого для любого типа указателя с плавающей точкой, строка или некоторый определяемого пользователем типа того) Воспрепятствовано скажем, что адрес памяти ADDRESS_2. Этот кусок памяти будет содержать адрес x i.e ADDRESS_1. Это все, что означает указатель.

И когда вы

&ptr; 

Это означает, что вы имеете в виду адрес PTR, который ADDRESS_2 в этом случае.

Это даст вам адрес, где хранится ptr в памяти.

Надежда вещи все будет ясно для вас, насколько это определение указателя идет ...

2

Я думаю Borgleader и Крисом есть лучшие идеи для объяснения этого, самым простым способом.

Прежде всего, вы должны помнить, что указатель также является переменной.Итак, хотя переменная int содержит целое число, указатель содержит адрес. И, как и другие переменные, у него есть адрес для себя.

Поэтому, когда вы делаете:

cout << p ... 

вы печатаете значение p (адрес нового вы только что создали узел) с другой стороны

cout << &p ... 

напечатает адрес p. Есть два совершенно разных адреса.

1

Рассмотрим исполнение этого великолепного художника куска гипотетического памяти сразу после выполнения node *p = new node;:

4  5  6  7  8  ....  
...___________________________________ ... 
... |  |  |  |  |  | ... 
... |  | 8 |  | info next | ... 
... |  |  |  |  |  | ... 
...----------------------------------- ... 
       ^
       | 
       "p" 

Существует node, начиная с ячейки номер 8, и ячейки номер 6 (который мы называем «р») содержит номер 8.

другими словами,
значение p 8, который является адрес node объекта, в то время как
величина &p - адрес переменной с именем «p» - это 6.

Смежные вопросы