Как использовать printf в C и что должен печатать мой код? - PullRequest
3 голосов
/ 18 февраля 2010

Я новичок в C и пытаюсь выяснить, что делает метод printf. У меня есть этот небольшой кусочек кода, и я продолжаю получать ошибки, когда я использую% x, например printf(“a) %x\n”, px); x% для шестнадцатеричного числа. Я просто использую здесь неправильный тип или что-то еще происходит? какой код должен печататься ниже?

int x = 10;
int y = 20;

int *px = &x;
int *py = &y;

printf(“a) %x\n”, px);
printf(“b) %x\n”, py);

px = py;

printf(“c) %d\n”, *px);
printf(“d) %x\n”, &px);

x = 3;
y = 5;

printf(“e) %d\n”, *px);
printf(“f) %d\n”, *py);

Ответы [ 3 ]

8 голосов
/ 18 февраля 2010

Использование целочисленных форматов (%x, %d и т. П.) Для печати указателей не является переносимым.Таким образом, для любого из указателей (px, py и &px, но не *px и *py) вместо этого следует использовать %p в качестве формата.

5 голосов
/ 18 февраля 2010

Работает на отлично, без ошибок (за исключением неверных кавычек, т. Е. «» Вместо «», но, думаю, именно так поступил ваш браузер).

Вот пример вывода вашего кода:

a) 22ff74
b) 22ff70
c) 20
d) 22ff6c
e) 5
f) 5

А вот и объяснение

int x = 10;
int y = 20;

int *px = &x;
int *py = &y;

// You're printing out the pointer values here, which are the memory addresses of the
// variables x and y, respectively. Thus this may print any reasonable number within
// the stack memory space.
printf("a) %x\n", px);
printf("b) %x\n", py);

// Both pointer now point to y...
px = py;

// ... so this will print the value of y...
printf("c) %d\n", *px);

// ...and this will print the address of px, which will probably but not necessarily
// be the (memory address of y - 4) because the stack grows down and the compiler
// allocates space for the variables one after another (first y, then px).
printf("d) %x\n", &px);

x = 3;
y = 5;

// Remember that both px and px point to y? That's why both *px and *py resolve to
// the value of y = 5.
printf("e) %d\n", *px);
printf("f) %d\n", *py);

Но в любом случае для указателя вы обычно должны использовать спецификатор формата "% p" вместо "% x", потому что это для целых чисел (которые могут иметь размер, отличный от указателя).

2 голосов
/ 18 февраля 2010

Вот вам хороший справочник printf.

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...