C语言中关于指针为形参的函数内部调用实参时的疑惑

 一句话说一下结论:形参的作用是要求传入的参数类型,但与函数内部调用无关

#include <stdio.h>
void print1(int *i)
{
    printf("函数print(int *i),调用print(p),i = p,传参为p,函数内使用的*i,所以函数内*i = *p = %d\n",*i);
}
void print2(int *i)
{
    printf("函数print(int *i),调用print(p),i = p,传参为p,函数内使用的i,所以函数内i = p = %d\n",i);
}
void print3(int *i)
{
    printf("函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的*i,所以函数内*i = * &p = p = %d\n",*i);
}
void print4(int *i)
{
    printf("函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的i,所以函数内i = &p = %d\n",i);
}
void main()
{
    int a;
    a = 10;
    int *p;
    p = &a;
    printf("main()中直接打印一下p 和*p作为参考:\n");
    printf("p:%d\n",p);
    printf("*p:%d\n",*p);
    // printf("\n");
    printf("接下来是函数内部调用实参p 和*p的对比:\n");
    printf("先说结论,形参只是要求函数传参的类型\n");
    printf("具体操作取决于函数内部的具体情况\n");
    printf("与形参上的标注无关\n");
    printf("以下四个例子都要求传入参数为指针类型\n");
    print1(p);
    print2(p);
    print3(&p);
    print4(&p);
}

 打印结果(结论):

main()中直接打印一下p 和*p作为参考:
p:6422044
*p:10
接下来是函数内部调用实参p 和*p的对比:
先说结论,形参只是要求函数传参的类型
具体操作取决于函数内部的具体情况
与形参上的标注无关
以下四个例子都要求传入参数为指针类型
函数print(int *i),调用print(p),i = p,传参为p,函数内使用的*i,所以函数内*i = *p = 10
函数print(int *i),调用print(p),i = p,传参为p,函数内使用的i,所以函数内i = p = 6422044
函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的*i,所以函数内*i = * &p = p = 6422044
函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的i,所以函数内i = &p = 6422032 

 

还有个特殊的例子,形参传入的参数本身是个指针时的状况

另外留意一下(*L)->data的注释说明

#include <stdio.h>
typedef struct Integer{
    int data;
}Integer;
typedef Integer *Int;
void print(Int *L)
{
    printf("我是形参*L,要求传入形式为&L\n");
    printf("实参传入&b时,*L = *&b,函数内部调用*L对应的值为*L = * &b = b = %d\n",*L);
    printf("实参传入&b时,L = &b,函数内部调用L对应的值为L = &b = %d\n",L);
    (*L)->data;/*这里要调用L的data,还是那句话,传入的参数要求是个指针,
    以实参&b为例,这里我们我们想拿到b的data就要*&b,而b本身又是个指针,
    所以访问b的data要用->,所以连起来就是(* &b)->data,
    所以没参数传入时要写成(*L)->data*/
}
int main()
{    
    Int b;  /*b本身是个指针变量*/  
    print(&b);   /*在这传入的是b这个变量的地址*/
}

打印结果: 

我是形参*L,要求传入形式为&L
实参传入&b时,*L = *&b,函数内部调用*L对应的值为*L = * &b = b = 16
实参传入&b时,L = &b,函数内部调用L对应的值为L = &b = 6422040 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值