实参和形参

今日内容

实参和形参:

'''
实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合

*****
形参:定义函数,在括号内声明的变量名,用来接受外界传来的值,外部提前产生了的变量,内部可以使用

''''''
注:形参随着函数的调用而产生,随着调用结束而销毁
'''

 

实参:

'''
位置实参:不用明确形参名的传参方式,一定按照位置给形参传值
关键字实参:必须明确形参名字与值为形参传值,可以不用按照位置


*****
注:混用
1.关键字实参必须出现在位置实参后
2.多个位置实参还是按照位置传参
3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序
'''
def fn2(a, b, c, d, e, f):
    print(a, b, c, d, e, f)

fn2(10, 20, 30, e=100, f=500, d=200)

位置形参的范畴:

    • 位置形参
# positional argument
def fn(a, b, c):
    print(a, b, c)
    
# 位置形参可以由 位置实参 与 关键字实参 来传值
fn(10, 20, 30)
fn(a=10, b=20, c=30)
  • 默认形参的
    def fn(a=10,b=20):
        print(a, b)
        
    # 默认形参可以由 位置实参 与 关键字实参 来传值,还可以不用传值(采用自身默认值)
    fn()
    fn(20, 30)
    fn(a=200, b=300)
    fn(100)  # 就给a传
    fn(b=100)  # 就给b传
    
    
    # 混用
    # 位置形参与默认形参同时存在,默认形参必须在后
    def fn1(a,b,c=10,d=20):
        print(a, b, c, d)
    
    # 位置形参必须传值,默认形参分情况传值
    fn1(100, 200, d=1000)
  • 可变长形参
    # 可变长形参会以 元组 形式接受 位置形参与默认形参未接受完的 所有传入的位置实参,用索引来取第几个
    # 可变长形参只能由 位置实参 来传值  *****
    def fn(a, b=10, *args):
        print(a, b)
        print(args)
        
        
    # 小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
    #       导致默认形参只能由位置实参来传值
    fn(1, 20, 100, 200) # 1给a  20给b,不能用b=20传  100,200给args

关键字形参范畴:

# 前提:出现在 * 之后的形参
def fn(a, b=10, *, c, d=20, e):
    pass
# c,d,e都是出现在*之后,都是关键字形参,由于必须由 关键字实参 来传值,没有顺序的强行要求


# 可变长关键字形参:用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值
# 用字典来存放数据
def fn(**kwargs):
    print(kwargs)
fn(a=10,b=20)  # {'a': 10, 'b': 20}

dic = {'x': 100, 'y': 200}
fn(**dic)  # {'x': 100, 'y': 200}

参数总结:

def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
    pass
# 位置形参:a、b
# 默认形参:c
# 可变长位置形参:args
# 无初值关键字形参:d、f
# 有初值关键字形参:e
# 可变长关键字参数:kwargs


# 1.位置形参与默认形参: 能用 位置实参 关键字实参 传值
# 2.可变长位置形参:只能 位置实参 传值
# 3.所以关键字形参:只能 关键字实参 传值

转载于:https://www.cnblogs.com/tyler-bog/p/10623228.html

### 关于C语言中实参形参指针的概念及用法 #### 定义与概念 在C语言中,当调用函数时传递参数分为两种方式:按值传递(pass by value)按地址传递(pass by reference)。对于指针类型的参数来说,通常采用的是按地址传递的方式。在这种情况下,形参是指针类型变量,而实参则是指向某个数据对象的指针。 - **形参**是在定义函数时声明的形式化参数,在函数内部使用这些形式化的名称来操作传入的实际数据。 - **实参**是实际调用函数时所提供的具体数值或者表达式的结果,它会作为输入被传递给对应的形参[^1]。 #### 使用方法及其区别 通过例子可以更清楚地理解两者之间的差异以及如何正确运用它们: ```c #include<stdio.h> // 函数原型声明 void exchange(int *x, int *y); int main() { int a = 5; int b = 10; printf("Before Exchange:\n"); printf("a=%d , b=%d \n", a, b); // 调用exchange函数并传递两个整数变量的地址 exchange(&a, &b); printf("After Exchange:\n"); printf("a=%d , b=%d \n", a, b); return 0; } // 此处实现交换功能的具体逻辑 void exchange(int *x, int *y){ int temp; temp=*x; *x=*y; *y=temp; } ``` 上述代码展示了利用指针完成两数互换的过程。其中`exchange()`接收两个指向整型的指针作为其形参,并在其体内修改这两个指针对应内存位置存储的内容从而达到外部可见的效果[^2]。 需要注意的一点是从上面第二个引用的例子可以看出如果只是简单改变形参本身所保存的那个副本,则不会影响到原始实参的状态。因为即使我们改变了形参p让它指向另一个新创建出来的局部变量x,这种变化并没有反馈回主程序中的那个原初版本p上;只有当我们真正去间接访问并通过解引用运算符(*)作用于其所指示的目标单元格的时候才会造成实质性的更改。 #### 总结说明 综上所述,掌握好实参形参之间关系尤其重要,尤其是在涉及到底层硬件层面的操作比如操作系统原理等领域更是如此。合理有效地应用指针能够极大地提升编程效率同时也增加了复杂度因此需要谨慎对待每一个细节之处以免引发难以察觉却危害巨大的错误发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值