指针对我来说是一件新事物,我很难理解它,但我不会屈服并希望能够学习它。
scanf ("%d", *p)
和scanf ("%d", p)
之间有什么区别?
在示例中,我看到如果我想在变量中输入一些值,我应该使用scanf ("%d", p)
。这对我没有意义。不应该是scanf ("%d", *p)
吗?
我将其解释为:"在指针指向的位置放置一些整数值"例如,它指向变量x
,然后它应该是x = 10
,但它不是。{0}。然后如何使用scanf()
和指针来设置数组中的值?
我在哪里以及出错了什么?我试图用C语言学习这个,因为它是我应该在课堂上使用的语言。
例如:
#include <stdio.h>
int main () {
float x[10], *p;
int i;
p = &x[0];
for (i = 0; i < 10; i++) {
scanf("%d", p + i);
}
for (i = 0; i < 10; i++) {
printf("%d", *(p + i));
}
return 0;
}
为什么第二个循环中的第一个p + i
和for () {}
中只有*(p + i)
?我会将*(p + i)
也放在第一个for () {}
中。 *(p + i)
对我来说就像是:&#34;对于第(p + i)个元素是什么,并使它等于某个值&#34;。
答案 0 :(得分:18)
*p
表示转到p
个地点
&p
表示取p
的地址,或&#34;获取指向&#34; p
int i;
scanf("%d", &i); // gives scanf a pointer to i
int i;
int *p = &i;
scanf("%d", p); // a more contrived way to say the same thing
强制性视觉解释是Pointer Fun with Binky。
您可以从右到左阅读类型:
int *p
=&gt; &#34; p
的类型为int *
&#34; =&GT; p
是指向int
的指针
int *p
=&gt; &#34; *p
的类型为int
&#34; =&GT; *p
是int
p
答案 1 :(得分:12)
一个是对的,另一个是错的。 (或者两者都可能是错的,取决于p
是什么。)
如果你打电话
scanf("%d", SOMETHING);
然后SOMETHING
必须成为int
的指针。
如果您有int
个对象,请使用一元&
获取其地址(即指向该对象的指针):
int n;
scanf("%d", &n);
如果p
恰好是int*
,那么您可以使用其值:
int *p;
scanf("%d", p);
但是在这里我没有为p
分配一个值,所以这个编译但是有不确定的行为。这没关系:
int n;
int *p = &n;
scanf("%d", p);
至于使用*p
,仅当p
是指向int
指针的指针时才有效:
int n;
int *p0 = &n;
int **p = &p0;
scanf("%d", *p);
但这样做很少有意义。绝大多数情况下,论证只是一些int
对象的地址,如&n
。
如果n
是一个整数,那么只需将n
传递给scanf
就没有意义。您只是传递n
的当前值。关键是您要允许scanf
在n
中存储新值,为此,scanf
需要n
的地址。< / p>
答案 2 :(得分:2)
C中的函数调用按值传递参数,而不是通过引用传递参数。这意味着当您使用参数调用函数时,函数会接收参数的副本,并且该函数无法直接修改调用点的原始参数。那就是:
int x = 42;
foo(x);
printf("%d\n", x);
foo
无法更改变量x
,代码将始终打印42
。
但是在很多情况下,函数可能希望修改调用者的参数。 scanf
就是这样一个案例。要实现此目的,这些功能需要使用一个间接级别。调用者不是将要修改的变量直接传递给函数,而是传递指向该变量的指针。然后该函数接收指针的副本,通过解除引用,可以访问并修改它指向的变量。
我建议花些时间阅读comp.lang.c常见问题解答。本主题在以下讨论:
答案 3 :(得分:1)
如果 p 是变量(例如,int),则可以使用&amp; p 将其指针传递给scanf。单独的 p 不是指针,* p会使问题复杂化。