Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scanf(“d”和*p)和scanf(“d”和*p)之间有什么区别?_C_Arrays_Pointers_Dereference - Fatal编程技术网

scanf(“d”和*p)和scanf(“d”和*p)之间有什么区别?

scanf(“d”和*p)和scanf(“d”和*p)之间有什么区别?,c,arrays,pointers,dereference,C,Arrays,Pointers,Dereference,指针对我来说是一件新鲜事,我正在努力理解它,但我不会屈服,希望能学会它 scanf(“%d”,p)和scanf(“%d”,p)之间有什么区别 在示例中,我看到如果我想在变量中输入一些值,我应该使用scanf(“%d”,p)。这对我来说没有意义。它不应该是scanf(“%d”,*p) 我将其解释为:“在指针指向的位置放置一些整数值”,例如,它指向变量x,然后它应该是x=10,但它不是。然后如何使用scanf()和指针来设置数组中的值 我哪里做错了,哪里做错了?我正试图用C语言学习这个,因为它是我应

指针对我来说是一件新鲜事,我正在努力理解它,但我不会屈服,希望能学会它

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;
}
#包括
int main(){
浮点数x[10],*p;
int i;
p=&x[0];
对于(i=0;i<10;i++){
scanf(“%d”,p+i);
}
对于(i=0;i<10;i++){
printf(“%d”,*(p+i));
}
返回0;
}

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

*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
强制性的视觉解释是

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

int*p
=>“
p
具有类型
int*
”=>
p
是指向
int


int*p
=>“
*p
具有类型
int
”=>
*p
p

指向的
int
,如果p是变量(例如,一个int),则使用&p将其指针传递到scanf。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
如果你打电话

scanf("%d", SOMETHING);
然后
某些东西必须是指向
int
的指针

如果您有一个
int
对象,请使用一元
&
获取其地址(即指向该对象的指针):

如果
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
是一个int,那么仅仅将
n
传递给
scanf
是没有意义的。您只需传递当前值
n
。关键是要允许
scanf
n
中存储一个新值,要做到这一点,
scanf
需要的是
n

函数调用的地址,在C中按值传递参数,而不是按引用传递参数。这意味着,当您使用参数调用函数时,该函数将接收参数的副本,并且该函数无法直接从调用站点修改原始参数。即:

int x = 42;
foo(x);
printf("%d\n", x);
foo
无法更改变量
x
,代码将始终打印
42

但在许多情况下,函数可能需要修改调用方的参数
scanf
就是这样一种情况。要实现这一点,这些函数需要使用一定级别的间接寻址。调用者不是将要修改的变量直接传递给函数,而是传递指向该变量的指针。然后,函数接收指针的副本,通过取消引用它,可以访问并修改它所指向的变量

我建议花些时间阅读comp.lang.c常见问题解答。本主题将在以下章节中讨论:


也许您应该添加类型…什么是
p
?如果
p
不是指针,您应该使用
scanf(“%d”,&p)
BTW:在使用希望读取的内容之前,检查
scanf()的返回值<代码>扫描(“%d”,p+i)!=1) Oops()
如果
p
是指针,则
p
的值为“指针指向的位置”<代码>*p
将是“指向的对象”。
scanf(“%d”和&x[i])将更易于编写和理解