scanf("%d",* p)和scanf("%d",p)之间有什么区别?

时间:2014-04-15 22:00:08

标签: c arrays pointers dereference

指针对我来说是一件新事物,我很难理解它,但我不会屈服并希望能够学习它。

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 + ifor () {}中只有*(p + i)?我会将*(p + i)也放在第一个for () {}中。 *(p + i)对我来说就像是:&#34;对于第(p + i)个元素是什么,并使它等于某个值&#34;。

4 个答案:

答案 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; *pint

指向的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的当前。关键是您要允许scanfn中存储新值,为此,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会使问题复杂化。