为什么我们使用%d而不是%p来存储变量数据,因为scanf将其作为指针?

为什么我们使用%d而不是%p来存储变量数据,因为scanf将其作为指针?,c,C,我完全明白,我必须使用%p来查找变量(&VAR)的地址和指针, 但是存储我们使用的值是scanf(“%d”和&a),而不是scanf(“%p”和&a)——但是为什么呢 我读过一些书,他们说printf(“%d”和&a)错了,而printf(“%p”和&a)。 根据上面的陈述,我对作为我的第一个陈述的scanf函数有些混淆。 有什么原因吗 原因是printf只关心一个值;它不在乎它来自哪里。所以,要打印一个整数,只需使用printf(“%d”,a)。您还可以使用常量整数,如printf(“%d”,

我完全明白,我必须使用
%p
来查找变量(
&VAR
)的地址和指针, 但是存储我们使用的值是
scanf(“%d”和&a)
,而不是
scanf(“%p”和&a)
——但是为什么呢

我读过一些书,他们说
printf(“%d”和&a)
错了,而
printf(“%p”和&a)
。 根据上面的陈述,我对作为我的第一个陈述的
scanf
函数有些混淆。
有什么原因吗

原因是
printf
只关心一个值;它不在乎它来自哪里。所以,要打印一个整数,只需使用
printf(“%d”,a)
。您还可以使用常量整数,如
printf(“%d”,42)
中所示


但是,由于
scanf
读取一个整数并将其存储起来,因此它需要知道将其存储到何处。因此,您必须传递一个变量的地址,
scanf
将把整数存储到该变量中。

scanf()和
printf()
的格式指令和说明符具有相似性,但它们的规范是独立的。期望其中一个的功能并将其应用于另一个具有局限性

示例
%d“
%i”
printf()
执行的操作完全相同,但对
scanf()
执行的操作略有不同


您可以使用
%p
打印指针,只要您不介意其格式是特定于平台的。如果您不介意,那么您可以使用类型
uintpttr\u t
(来自
)和转换说明符,例如
PRIXPTR
PRIXPTR
PRIuPTR
来自
。您通常不使用
scanf()
读取指针;写入磁盘的指针在当前程序中很少有效,因此很少有理由这样做。如果您必须这样做,那么
%d
几乎总是错误的-如果
sizeof(int)==sizeof(int*)
,这在32位系统上是正确的,但在大多数64位系统上不是。
// %d needs a corresponding address of an int.
// By providing an address, scanf() knows where to store the int it scans.
int i;
scanf("%d", &i);  

// %d needs a corresponding int.
// By providing an int, printf() knows what int to print.
int j;
printf("%d", j);