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

Nic*_*ick 7 c arrays pointers dereference

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

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

在示例中,我看到如果我想在变量中输入一些值,我应该使用scanf ("%d", p).这对我来说没有意义.不应该scanf ("%d", *p)吗?

我将其解释为:"在指针指向的位置放置一些整数值",例如它指向变量x然后它应该是x = 10,但事实并非如此.然后如何使用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;
}
Run Code Online (Sandbox Code Playgroud)

为什么只p + i在第一个for () {}*(p + i)第二个循环中?我也会把它放在*(p + i)第一个for () {}.*(p + i)对我来说就是:"对第(p + i)个元素是什么,并使它等于某个值".

Rya*_*ing 18

*p是指去的地方p
&p手段采取的地址p,或"获得一个指向"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
Run Code Online (Sandbox Code Playgroud)

强制性的视觉解释是Pointer Fun with Binky.

您可以从右到左阅读类型:

int *p>> phas type int *"=> p是指向int
int *p=>" *phas type int" 的指针=> *pint指向的p


Kei*_*son 12

一个是对的,另一个是错的.(或两者都可能是错的,取决于是什么p.)

如果你打电话

scanf("%d", SOMETHING);
Run Code Online (Sandbox Code Playgroud)

然后SOMETHING 必须是一个指针int.

如果你有一个int对象,使用一元&来获取它的地址(即指向对象的指针):

int n;
scanf("%d", &n);
Run Code Online (Sandbox Code Playgroud)

如果p碰巧是一个int*,那么你可以使用它的值:

int *p;
scanf("%d", p);
Run Code Online (Sandbox Code Playgroud)

但是这里我没有赋值p,所以这个编译但是有未定义的行为.还行吧:

int n;
int *p = &n;
scanf("%d", p);
Run Code Online (Sandbox Code Playgroud)

至于使用*p,只有当p指针指向一个指针时才有效int:

int n;
int *p0 = &n;
int **p = &p0;
scanf("%d", *p);
Run Code Online (Sandbox Code Playgroud)

但这样做很少有意义.绝大多数时候,这个论点只是一些int对象的地址,就像&n.

如果n是一个int,那么只是传递nscanf没有意义.你只是路过的电流n.关键是你要允许scanf存储一个新值n,并且要做到这一点,scanf需要的是地址n.