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

80

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

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

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

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

Франк V
источник
То, что вы написали, правильно, с какой именно проблемой вы столкнулись?
Лука Маттеис,
Как я описал, я получал результаты, но не имел возможности узнать, были ли результаты правильными или это доставляло мне хлам. Дон и другие ниже (а также вы) подтвердили, что эти результаты действительны.
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 *.

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

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

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

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

результат:

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

4pie0
источник
0

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

gbarry
источник
3
за счет неосведомленности - не могли бы вы уточнить, как можно написать такую ​​рутину?
Faisal Vali
1
Также этот ответ может быть лучше подходит в качестве комментария?
RastaJedi