форматирование printf (% d против% u) - PullRequest
15 голосов
/ 21 июля 2009

В чем разница между %d и %u при печати адресов указателей?

Например:

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"

Ответы [ 5 ]

26 голосов
/ 21 июля 2009

Список выходов форматирования можно найти на этой странице .

%d - целое число со знаком, а %u - целое число без знака. Указатели (если их считать числами) обычно неотрицательны.

Если вы действительно хотите отобразить указатель, используйте спецификатор формата %p.

6 голосов
/ 16 мая 2016

% u печатает целое число без знака

% d печатает целое число со знаком

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

Другой список форматирования Escape:

Вот полный список форматов экранирования. Я просто делаю снимок экрана с этой страницы

enter image description here

6 голосов
/ 21 июля 2009

Если я правильно понимаю ваш вопрос, вам нужно %p, чтобы показать адрес, который использует указатель, например:

int main() {
    int a = 5;
    int *p = &a;
    printf("%d, %u, %p", p, p, p);

    return 0;
}

выведет что-то вроде:

-1083791044, 3211176252, 0xbf66a93c
1 голос
/ 09 марта 2017

Разница проста: они приводят к появлению разных предупреждающих сообщений при компиляции:

1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %d\n", &a); // prints "memory add=-12"
                               ^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("memory address = %u\n", &a); // prints "memory add=65456"
                               ^

Если вы передадите указатель как void* и используете %p в качестве спецификатора преобразования, то вы не получите сообщение об ошибке:

#include <stdio.h>

int main()
{
    int a = 5;
    // check the memory address
    printf("memory address = %d\n", &a); /* wrong */
    printf("memory address = %u\n", &a); /* wrong */
    printf("memory address = %p\n", (void*)&a); /* right */
}
1 голос
/ 10 июля 2013

% u используется для целого числа без знака. Поскольку адрес памяти, указанный оператором целочисленного адреса со знаком% d, равен -12, для получения этого значения в целом числе без знака компилятор возвращает значение целого числа без знака для этого адреса.

...