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])代码>将更易于编写和理解