int *p;
scanf("%d",&p);
printf("%d\n",p);
在我过去的理解中,“p”是一个地址,但现在似乎p是一个简单的变量。
我无法理解为什么这三行代码是对的!!!
你可以帮帮我吗?答案 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)
该代码根本不对。
某些(坏)编译器可能无法检测到问题,因为printf
和scanf
都是可变函数...但是例如g ++会警告您传递的类型与格式字符串中指定的那些。