2016-10-24 4 views
-2

У меня есть этот кусок кода:C печать Программирование указатели

printf("Address for ptr_one %p\n", &ptr_one); 
printf("Non-Address for ptr_one %p\n", ptr_one); 
printf("value for ptr_one %p\n\n", *ptr_one); 

выход:

Address for ptr_one 0xffffcbd8 
Non-Address for ptr_one 0x600042b26 
value for ptr_one 0x19 

Из того, что я понимаю, первая строка является адресом указателя, а третий является значение, которое по этому адресу. Но какова вторая строка печати?

Он был инициализирован, как, например:

int *ptr_one = (int *)malloc(sizeof(int)); 
*ptr_one = 25; 

редактировать: добавлен инициализировать код

+5

В зависимости от определения 'ptr_one' и как он был назначен. – dbush

+3

Nah, первая печатает адрес переменной, которая содержит указатель на что-то еще. Второй печатает этот указатель. - Предполагая, конечно, имя на самом деле является представителем контента, и оно было начато правильно, как сказал дбуш. – enhzflep

+0

'printf (« Non-Address for ptr_one% p \ n », ptr_one);' это адрес, который содержит '* ptr_one'. 'printf (« Адрес для ptr_one% p \ n », & ptr_one); это адрес' ptr_one' – tesseract

ответ

0

Первая строка адреса памяти указателя, вторая линия является адрес, который указывает указатель на, а третий это первое значение, которое находится по этому адресу.

2

Это выглядит как у вас есть код вдоль линий:

int one = 0x19; 
int *ptr_one = &one; 

(вы так отредактировали код, чтобы показать реальную ситуацию, но это функционально идентично тому, что я показал выше (с точки зрения памяти и указателей на память в любом случае), так что мне не нужно его менять).

Что вы тогда имеете это:

(ptr_one "variable") 
    | 
    V 
+---------------+  +-----------+ 
| ptr_one value | --> | one value | 
+---------------+  +-----------+ 

со следующими описаниями:

  • Адрес для ptr_one 0xffffcbd8 является адрес фактической ptr_one переменной, где он хранится в памяти.
  • Non-адрес для ptr_one 0x600042b26 является значения из ptr_one переменных, которая является также адресом переменной one.
  • значение для ptr_one 0x19 - значение переменной one.
+0

, поэтому он скорее всего вызывает неопределенное поведение из-за печати int с помощью '% p' –

0

Ваш пример немного краток и не упоминает тип ptr_one. Предположим, у вас есть

int x=10; 
int *ptr_one=&x; 

Тогда

printf("Address for ptr_one %p\n", &ptr_one); 

печатает адрес указателя, т.е. ptr_one

printf("ptr_one %p\n", ptr_one); 

печатает адрес x (ptr_one является указателем в конце концов.)

printf("ptr_one points to %p\n\n", *ptr_one); 

печатает значение x (Здесь вы разыменовать указатель получает значение, хранящееся в нем)

0

ptr_one является указателем intiger присутствует в адресной строке 0xffffcbd8. В настоящее время он указывает на адрес 0x600042b26. В адресе 0x600042b26 у нас есть значение 25 в нем.

Эта ссылка показывает how ptr_one выделяются в памяти

Надеется, что это дает ответ ..

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