2015-07-28 1 views
0

Здесь p - это целочисленный указатель, который может содержать адрес int переменной, но также имеет адрес памяти - там, где он хранится.Как адрес указателя, который содержит адрес массива, одинаковый?

пусть базовый адрес массива a = 1002 адрес указателя p = 2008

когда мы пишем: int *p=a; //p points to the base address of array a
и int **r=&p; //means *r points to the address of p

как *r указывает на адрес a, он должен указывать на адрес p.

#include <stdio.h> 
void main() 
{ 
    int a[3] = {1, 2, 3}; 
    int *p =a; 
    int **r = &p; 
    printf("%p %p", *r, a); 
} 
+2

Почему бы и нет? Вы позволяете 'r' указывать на адрес, где хранится' p', а затем печатать '* r', поэтому очевидно, что это' p', который вы назначили 'a' – marcolz

+0

Это должно быть int * p = & a; или иначе это неверное преобразование –

+1

@DevangJayachandran: 'int [3]' распадается на 'int *' – Jarod42

ответ

2

Пожалуйста, обратите внимание, что

int *p=a; 

означает, что a и p теперь указывает на тот же адрес.

Кроме того, это r, что указывает на p (это адрес p), а не *r.

Таким образом, чтобы напечатать адрес p просто использовать r вместо *r в printf().

printf("%p %p", r, a); 
7

Неправильный номер printf. Он должен быть r напечатает адрес r указывает на:

printf("%p %p", r, a); 

Используя *r, вы почтительное r (то есть, переход на адрес r который указывает) и, таким образом, печать адреса a.

2

Что находится внизу?

int **r = &p; 

В принципе, используя выше, r имеет адрес p правой? Итак, если вы разыгрываете r, как и вы, *r, он попытается получить , чтобы получить значение, хранящееся по адресу p. Который a.

Примечание: Вы должны бросить в void* в Printf:

printf("%p %p", (void*)*r, (void*) a); 
1

Не -> -> так же, как ->

Когда вы говорите,

int *p = a; 

это означает , P указывает на a, или P имеет адрес a.

То же самое в случае int **r=&p;

R содержит адрес P, бы вы использовали printf("%p %p", r, a);, вы бы получили адрес P.

, но так как вы разыменования г, вы получили адрес .

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