为什么这3行代码是对的?关于* p

时间:2013-09-23 17:17:34

标签: c++ pointers

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

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

我无法理解为什么这三行代码是对的!!!

你可以帮帮我吗?

5 个答案:

答案 0 :(得分:4)

只有当指针与整数大小相同时才会起作用,因为您基本上将指针视为整数。也就是说,如果int是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用作整数而不是将其声明为指针并将其视为整数。

答案 1 :(得分:3)

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

float* p;

它仍然似乎工作。最后,这是一个很好的例子,说明为什么要避免使用非类型安全的C风格接口。

答案 2 :(得分: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

答案 3 :(得分:1)

上面的代码实际上不是正确的,而是建立在相当数量的假设和C构造之上。

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

的平台上也是如此

答案 4 :(得分:1)

该代码根本不对。

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