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(*是取地址符,本质就是进行仓库的访问,有效)
}

希望能理解!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-12
只需明白一点:实参与形参的数据类型必须一致。所以如果要传指针,则形参也必须是相应数据类型的指针类型。如:
void fun(int *P){……} 且有int i=0;int *pt=&i,则调用fun(pt)合法(pt给你p类型一致,都是指向整形数据的指针),而调用fun(i)不合法(p与i类型不一致)。
第2个回答  2013-08-12
可以 但是得是指针指向的值
第3个回答  2013-08-12
可以 自己使用的时候注意 想明白了就行
相似回答