是什么导致我的指针不更新其指向的地址并显示正确的值?
我正在尝试使用指针进行一些练习,但似乎无法理解我在下面的示例中搞砸了的地方。我创建了两个整数变量并为它们分配了值。我还创建了一个整数指针并为其分配了第一个整数变量地址。然后我尝试使用 scanf() 将十六进制地址传递给指针,以便它更新其指向的地址。然后我尝试打印指针的十进制值,如果它正常工作应该是 200,但它仍然显示数字 1 值的原始地址,即 100。
#include <stdio.h>
int main()
{
int number1 = 100;
int number2 = 200;
int *p = &number1;
printf("Number 1 Value: %d n", number1);
printf("Number 1 Address: 0x%X nn", &number1);
printf("Number 2 Value: %d n", number2);
printf("Number 2 Address: 0x%X nn", &number2);
printf("Pointer Number 1 Value: %d nn", *p);
printf("Enter Number 2's Address to view it's value: ");
scanf("%X", *p);
printf("nPointer Value: %dnn", *p);
return 0;
}
回答
scanf("%X", *p); 有三个错误:
- 指针的正确转换规范是
%p,不是%X。 - 参数必须是指针的地址,但
*p传递指向对象的值,而不是指针的地址。 - 参数必须指向 a
void *,但是p是int *。
回到之前的printf调用,打印地址,使用地址%p并将其转换为void *:
printf("Number 1 Address: 0x%pnn", (void *) &number1);
printf("Number 2 Address: 0x%pnn", (void *) &number2);
printf("Pointer Number 1 Value: 0x%pnn", (void *) p);
当指针printf作为参数传递给%Xor%d转换规范时,C 标准未定义该行为。当%p被使用时,参数应该是一个void *。(传递 anint *不足以保证 C 标准定义的行为,因此将其转换为void *.)
要扫描地址,您必须提供void *. 因为p是int *,你不能直接扫描到它。创建一个临时文件void *并将其用于扫描:
// Create temporary "void *".
void *t;
// Scan into the "void *".
int result = scanf("%p", &t);
// Check return value of scanf.
if (result != 1)
{
fprintf(stderr, "Error, scanf did not work.n");
exit(EXIT_FAILURE);
}
// Convert from temporary "void *" to "int *".
p = t;