Как спецификаторы %p
и %Fp
работают в следующем коде?
void main()
{
int i=85;
printf("%p %Fp",i,i);
getch();
}
Я получаю o/p как 0000000000000055 0000000000000055
Как спецификаторы %p
и %Fp
работают в следующем коде?
void main()
{
int i=85;
printf("%p %Fp",i,i);
getch();
}
Я получаю o/p как 0000000000000055 0000000000000055
Если это то, что вы запрашиваете,% p и% Fp распечатывают указатель, в частности адрес, на который ссылается указатель, и поскольку он печатает часть вашей компьютерной архитектуры, он делает это в шестнадцатеричном формате.
В C вы можете использовать между указателем и int, поскольку указатель представляет собой просто 32-разрядное или 64-разрядное число (в зависимости от архитектуры компьютера), относящееся к вышеупомянутому фрагменту памяти.
И, разумеется, 55 в шестнадцатеричном состоянии - в десятичном значении.
% p предназначен для печати адреса указателя.
85 в десятичном формате - 55 в шестнадцатеричном формате.
В вашей системе указатели имеют 64 бит, поэтому полное шестнадцатеричное представление: 0000000000000055
Вот результат компиляции с моей машины:
format.c: 7: 5: warning: format '% p ожидает аргумент типа' void *, но аргумент 2 имеет тип 'int [-Wformat]
format.c: 7: 5: warning: format '% F ожидает аргумент типа double, но аргумент 3 имеет тип' int [-Wformat]
поэтому есть предупреждения, но они компилируются и вывод: 0x55 0,000000p
Я удивлен, что вы не получаете p в конце. Вы уверены, что код и результат совпадают? Я думаю, это не исключает, что адрес я также будет 0x0... 055..было что-то здесь не так.
btw: типичное использование% p должно было бы печатать адрес i.e. & я в противоположность int
Цель состоит в том, чтобы напечатать значение указателя в определенном формате реализации. Соответствующий аргумент должен быть значением void *
.
И %p
используется для печати адреса указателя, который зависит от нашего системного бита.
Дополнение к тому, что сказал @Myforwik
% p предназначен для печати адреса указателя.
% Fp, вероятно, используется для форматирования указателя FAR, который имеет форму → (0x1234: 0x5678)
и 85 в десятичном значении - 55 в шестнадцатеричном формате.
Надеюсь, теперь все в порядке.
Ссылки: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html http://www.winehq.org/pipermail/wine-devel/2005-March/034390.html
%p
предназначен для печати адреса, но вам нужно использовать ampersand
ie &
оператор &
перед тем, как i
получить адрес i
Таким образом, чтобы получить адрес переменной i
правильный формат будет:
void main()
{
int i=85;
printf("%p %Fp", &i, &i);
getch();
}
если вы не используете &
тогда вы просто получите значение, содержащееся в i
которое в этом случае составляет 85
или 55
в шестнадцатеричном