int *p;
scanf("%d",&p);
printf("%d\n",p);
在我过去的理解中,“p”是一个地址,但现在看来 p 是一个简单的变量。
我不明白为什么这 3 行代码是正确的!!!
你能帮助我吗?
这仅在指针与整数大小相同时才有效,因为您基本上将指针视为整数。即 ifint
是 32 位整数,指针void*
是 32 位地址。
应该这样写:
int p; // not the lack of the *
scanf("%d",&p); // this gives scanf the address of p
printf("%d\n",p); // this uses p's value
它实际上将p
用作整数,而不是将其声明为指针并将其视为整数。
他们是不对的。它们似乎只是工作,因为您要求scanf
存储一个整数,而存储它的地址是指针 p
的地址。您基本上将指针本身的存储视为整数的存储。同样对于printf
,您传递指针的地址(其中包含整数)并要求printf
从那里读取它作为...整数。您甚至可以将第一行更改为
float* p;
它似乎仍然有效。最后,这是一个很好的例子,说明了为什么应该避免非类型安全的 C 风格接口。
如果我将通过您的陈述进行解释,那么它将是
int *p; //Declaration of pointer variable p, which can hold the address of integer variable
scanf("%d",&p); //Getting input, will be stored at address of pointer variable p
printf("%d\n",p); //It will display the value stored at &p
上面的代码并不是真正正确的,它是建立在大量假设和 C 结构之上的。
第一个假设是指针和 anint
具有相同的大小,这将在大多数(我所知道的)64 位平台中中断。然后它使用类型不安全的接口(可变参数函数参数)来传递 an 的地址,int*
就好像它是 an 的地址一样int
。里面的代码scanf
将假设它正在int
写入一个并覆盖位......但类型int*
不是sizeof(int) = sizeof(int*)
该代码根本不正确。
一些(坏的)编译器可能无法检测到问题,因为两者printf
都是scanf
可变参数函数......但例如 g++ 会警告您传递的类型与格式字符串中指定的类型不匹配。