外贸网

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

    作者:媒体   更新日期:2024.05.19
    额,你这个问题是这样的么?

    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类型不一致)。

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

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

    C语言问题 函数中形参若为指针,则调用时对应位置上的实参不能是()

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

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

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