C语言问题 函数中形参若为普通变量,则调用时对应位置上的实参可以是指针吗

作者&投稿:花阮 (若有异议请与网页底部的电邮联系)
C语言问题 函数中形参若为指针,则调用时对应位置上的实参不能是()~

不能是
简单变量,因为
它不是地址。
语法规则而已。
形参若为指针,实参必须是
指针变量,或
数组名,或
简单变量的地址。
数组名
就是数组的首地址,是地址
简单变量的地址
是地址
形参若为指针,实参是
指针变量,这是一一对应,天经地义。

不能是 简单变量,因为 它不是地址。

语法规则而已。
形参若为指针,实参必须是 指针变量,或 数组名,或 简单变量的地址。
数组名 就是数组的首地址,是地址
简单变量的地址 是地址
形参若为指针,实参是 指针变量,这是一一对应,天经地义。

额,你这个问题是这样的么?

void fun(int x)
{....}

调用时,你是
int *p;
fun(p);//用指针变量来做形参

这是不对的,因为编译器虽然弱智,但是他能分清楚类型啊。你这样相当于耍了编译器,他会报错的,通不过去。
你就把编译器看成是很傻很天真的门卫,只要符合你定义的,就能通过(至于运行出不出问题,比如逻辑错误等,他是不管的,这个是你自己编程的事情)。否则是不让你通过的。

再多讲一点:
为何要用指针做形参呢?因为指针是地址,这样一般情况下会使得该函数成功。(若是采用普通变量做形参,函数运行了一圈,出去之后,发现,什么都没变化,这个很郁闷的)

指针做变量一定能够改变他的值么?
不一定!

在调用的函数中,只有当出现“ *p,或者是p->成员变量 "进行赋值时,才是改变的原本变量的值。

比如void fun(int *p,int *r)
{
int *temp;
temp=p;
p=r;
r=temp;
} //貌似是指针做形参,但是p,r所指代的值交换了么?没有,因为这只是对指针本身来回折腾的,压根就没改变指针所指向的值

但是看这个
void fun(int *p, int *r)
{
int temp;
temp=*p;
*p=*r;
*r=temp; //发现没,这个里面折腾的是*p,*r.这才是折腾到了指针所指向的值。
}

当然,采用引用(&)和指针的效果一样,都是折腾到本质。

你要记住的是,一个函数的形参,在函数调用时,并不是用的本身,而是一个临时变量!

void fun(int *p, int *r)
{int *temp;
p=r; //此时的p,r根本不是你带入的p,r,而是_p , _r,就是个临时变量。
}

如果只是针对指针本身折腾,就是在折腾_p, _r。这样和p,r一点关系都没有,所以不会有任何改变

比如void fun(int *p,int *r)本质就是在进行这个
{
int *temp;
temp=_p;
_p=_r;
_r=temp;//发现没,都是_p,_r,函数结束,都是要回收的,屁用没有
}

但是为何用*p,*r会管用呢? 因为P, _P指向相同的仓库。 r ,_r指向相同的仓库!
*p,*_p 都是对仓库进行折腾,所以*_p折腾完被回收后,仓库已经被改变了。此时用p打开仓库,已经是事实了。已经改变过了,这就是调用函数成功了
void (int *p,int *r)
{
int temp;
temp=*p;//本质是执行 temp=*_p,但是*_p==*p(*是取地址符,本质就是进行仓库的访问,有效)
}

希望能理解!

只需明白一点:实参与形参的数据类型必须一致。所以如果要传指针,则形参也必须是相应数据类型的指针类型。如:
void fun(int *P){……} 且有int i=0;int *pt=&i,则调用fun(pt)合法(pt给你p类型一致,都是指向整形数据的指针),而调用fun(i)不合法(p与i类型不一致)。

可以 但是得是指针指向的值

可以 自己使用的时候注意 想明白了就行


京山县15738106476: C语言问题 函数中形参若为普通变量,则调用时对应位置上的实参可以是指针吗 -
浑南谱乐: 额,你这个问题是这样的么?void fun(int x) {....}调用时,你是 int *p; fun(p);//用指针变量来做形参这是不对的,因为编译器虽然弱智,但是他能分清楚类型啊.你这样相当于耍了编译器,他会报错的,通不过去. 你就把编译器看成是很傻很...

京山县15738106476: C语言 被调函数中一般变量和指针变量均作为形参,函数如何调用?函数值如何返回? -
浑南谱乐: 一般变量作为形参,是不能改变实参值的哦,要返回数据就用return; 指针指向真实的地址,不重新分配内存,所以调用函数后,如果函数里改变了指针指向的值,那这个数就真的变了. 调用就是用函数名,还要传送相应的调用参数.

京山县15738106476: C语言,请问这题,形参什么时候用结构体指针,什么时候用普通的结构体变量来接收呢?要是像我写得这种行 -
浑南谱乐: 一般来说函数要对形参进行操作,改变传入的真实值并在函数外面继续影响的时候用指针,或者传入的形参是个数组的时候用形参. 如果改变形参的值,在函数外面不受影响的话,最好直接传值,(指针也应该没有问题). 当然,如果形参所占地址特别大,传递指针在比传递值快,应为复制一大坨东西肯定没有就复制一个地址快. 对于上述函数的input,input的内容肯定在外面还要用,所以要直接改变那个地址上的值,所以只指针. 你写的问题不大,但是为什么三个函数都叫copy

京山县15738106476: C语言程序函数调用实参形参变化 -
浑南谱乐: 不变.调用函数时,形参只是一个局部变量,赋值时调用实参的数据而已. 但是特别情况是,如果你在函数内部使用了指针型的变量,就会复杂一些. 如果只是普通的调用,不会影响. 你可以看看局部变量与全局变量的说明

京山县15738106476: c语言中 形参可以是变量吗? -
浑南谱乐: 应该是实参吧 ------------- c语言中 实参 可以是变量,常量,表达式. 其实,变量和常量也是属于表达式的范畴的.

京山县15738106476: 在C语言中,函数的形参只能用auto或register来说明吗? -
浑南谱乐: 首先,第一个是不正确的.每个的具体说明如下: 第一,函数的形参不仅可以用auto或者register来说明,因为函数的形参还可以用const来定义一个其值不可变的常量形参,还可以在main函数前定义一个结构体,然后用结构体名来定义函数的形...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网