Вывести адрес или указатель на значение в C


80

Я хочу сделать что-то довольно простое. Я получаю результаты, но проблема в том, что у меня нет возможности узнать, верны ли результаты.

Я работаю на C, и у меня есть два указателя; Я хочу распечатать содержимое указателя. Я не хочу разыменовать указатель, чтобы получить указанное значение, мне просто нужен адрес, который сохранил указатель.

Я написал следующий код, и мне нужно знать, правильный ли он, а если нет, то как его исправить.

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


То, что вы написали, правильно, с какой именно проблемой вы столкнулись?
Лука Маттеис,

Как я описал, я получал результаты, но не имел возможности узнать, были ли результаты правильными или это доставляло мне хлам. Дон и другие ниже (а также вы) подтвердили, что эти результаты действительны.
Frank V,

Ответы:


29

То, что у вас есть, правильно. Конечно, вы увидите, что emp1 и item1 имеют одинаковое значение указателя.


1
Они не будут такими же, если тип item1 является частью множественного наследования и / или является предком Emp, в зависимости от того, как компилятор размещает каждый из классов, составляющих тип item1.
Джим Бак,

2
@Jim: Тег "C" говорит об обратном
Hasturkun

1
@ Джим: Хастуркун прав. Я работаю на C. Я должен был это опубликовать.
Frank V

39

Чтобы напечатать адрес в указателе на указатель:

разыменовать один раз и вывести второй адрес:

Вы всегда можете проверить с помощью отладчика, если вы используете Linux dddи отображаете память или просто gdb, вы увидите адрес памяти, чтобы вы могли сравнить со значениями в ваших указателях.


16

Думаю, это было бы наиболее правильно.

printf()является вариативной функцией, и ей должны передаваться аргументы правильного типа. Стандарт говорит, что %pберет void *.


Я представляю, их продвигают? Не уверен, может кто-нибудь уточнить?
RastaJedi

4
После некоторого исследования, нет, они не продвигаются автоматически. Приведение к void *действительно требуется.
RastaJedi 02 апр.'16

10

Поскольку вы, кажется, уже решили отображение адреса базового указателя, вот как вы можете проверить адрес двойного указателя:

Вы сможете получить доступ к адресу двойного указателя a, выполнив:


printf("which contains this value: %c\n" **a);просто хотел добавить это ^. ^.
RastaJedi

4

результат:

ptr: 0xbfb4027f, значение: A, а также адрес: 3216245375


0

Я был в этом положении, особенно с новым оборудованием. Я предлагаю вам написать небольшую подпрограмму дампа в шестнадцатеричном формате. Вы сможете увидеть все данные и адреса, по которым они находятся. Это хорошая практика и вселяет уверенность.


3
за счет неосведомленности - не могли бы вы уточнить, как можно написать такую ​​рутину?
Faisal Vali

1
Также этот ответ может быть лучше подходит в качестве комментария?
RastaJedi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.