Подтвердить что ты не робот

% p Спецификатор формата в c

Как спецификаторы %p и %Fp работают в следующем коде?

void main() 
{
    int i=85;

    printf("%p %Fp",i,i);

    getch();   
}

Я получаю o/p как 0000000000000055 0000000000000055

4b9b3361

Ответ 1

Если это то, что вы запрашиваете,% p и% Fp распечатывают указатель, в частности адрес, на который ссылается указатель, и поскольку он печатает часть вашей компьютерной архитектуры, он делает это в шестнадцатеричном формате.

В C вы можете использовать между указателем и int, поскольку указатель представляет собой просто 32-разрядное или 64-разрядное число (в зависимости от архитектуры компьютера), относящееся к вышеупомянутому фрагменту памяти.

И, разумеется, 55 в шестнадцатеричном состоянии - в десятичном значении.

Ответ 2

% p предназначен для печати адреса указателя.

85 в десятичном формате - 55 в шестнадцатеричном формате.

В вашей системе указатели имеют 64 бит, поэтому полное шестнадцатеричное представление: 0000000000000055

Ответ 3

Вот результат компиляции с моей машины:

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

Ответ 4

Цель состоит в том, чтобы напечатать значение указателя в определенном формате реализации. Соответствующий аргумент должен быть значением void *.

И %p используется для печати адреса указателя, который зависит от нашего системного бита.

Ответ 5

Дополнение к тому, что сказал @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

Ответ 6

%p предназначен для печати адреса, но вам нужно использовать ampersand ie & оператор & перед тем, как i получить адрес i

Таким образом, чтобы получить адрес переменной i правильный формат будет:

void main() 
{
    int i=85;

    printf("%p %Fp", &i, &i);

    getch();   
}

если вы не используете & тогда вы просто получите значение, содержащееся в i которое в этом случае составляет 85 или 55 в шестнадцатеричном