2
int *p;
scanf("%d",&p);
printf("%d\n",p);

在我过去的理解中,“p”是一个地址,但现在看来 p 是一个简单的变量。

我不明白为什么这 3 行代码是正确的!!!

你能帮助我吗?

4

5 回答 5

4

这仅在指针与整数大小相同时才有效,因为您基本上将指针视为整数。即 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用作整数,而不是将其声明为指针并将其视为整数。

于 2013-09-23T17:25:17.020 回答
3

他们是不对的。它们似乎只是工作,因为您要求scanf存储一个整数,而存储它的地址是指针 p的地址。您基本上将指针本身的存储视为整数的存储。同样对于printf,您传递指针的地址(其中包含整数)并要求printf从那里读取它作为...整数。您甚至可以将第一行更改为

float* p;

它似乎仍然有效。最后,这是一个很好的例子,说明了为什么应该避免非类型安全的 C 风格接口。

于 2013-09-23T17:20:52.633 回答
1

如果我将通过您的陈述进行解释,那么它将是

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
于 2013-09-23T17:22:48.777 回答
1

上面的代码并不是真正正确的,它是建立在大量假设和 C 结构之上的。

第一个假设是指针和 anint具有相同的大小,这将在大多数(我所知道的)64 位平台中中断。然后它使用类型不安全的接口(可变参数函数参数)来传递 an 的地址,int*就好像它是 an 的地址一样int。里面的代码scanf将假设它正在int写入一个并覆盖位......但类型int*不是sizeof(int) = sizeof(int*)

于 2013-09-23T17:24:10.093 回答
1

该代码根本不正确。

一些(坏的)编译器可能无法检测到问题,因为两者printf都是scanf可变参数函数......但例如 g++ 会警告您传递的类型与格式字符串中指定的类型不匹配。

于 2013-09-23T17:27:18.887 回答