【C++ Primer 学习札记】函数传参问题

 

参考博文:

https://blog.csdn.net/weixin_40026739/article/details/121582395

什么是形参(parameter),什么是实参(argument)

1. 形参

函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参

形参是函数声明或定义时列出的参数,本质是函数作用域内的局部变量,用于接收调用时传入的数据。形参在函数被调用前没有实际内存分配,仅作为占位符存在。

特点​​:

在函数声明和定义中声明,例如:int add(int a, int b)中的a和b是形参。

形参的类型必须明确指定,且可以是变量或引用类型(如指针或引用)。

形参的作用域仅限于函数内部,函数执行结束后会被释放。

参考【C语言编译】C语言的函数调用的过程_c语言函数的调用过程是什么-CSDN博客

函数调用过程中,栈区(stack)可以存放函数的参数值,局部变量的值等,由编译器自动分配释放

2. 实参

给形参传递值的变量称为实际参数,简称实参

实参是函数调用时传递给形参的具体值或变量,包含实际的数据,用于初始化形参

特点​​:

可以是常量、变量、表达式、指针或引用。例如:add(3, 5)中的3和5是实参。

实参的类型必须与形参匹配,否则会触发隐式类型转换(如char转int),若无法转换则报错。

实参的值通过​​值传递​​、​​引用传递​​或​​指针传递​​方式传递给形参,其中值传递会复制数据,后两者直接操作内存地址

这里列举形参为指针以及指针的指针的情况:

1. 形参为指针,实参为变量的地址

当数据类型需要占用大量内存时候,可以避免数据拷贝

void test_ptr(int* data){
    std::cout<<*data<<std::endl;
}
int main() {

    int data = 1;
    test_ptr(&data);

    return 0;
}

输出为:

1

2. 形参为指针,实参为指针

数组变量,本质上是数组首元素的地址

void test_ptr4(int* data){
    std::cout<<data[1]<<std::endl;
    data[1] = 2;
    std::cout<<data[1]<<std::endl;
}
int main() {

    int* data = nullptr;
    data = new int[10];
    data[1] = 1;
    test_ptr4(data);
    std::cout<<data[1]<<std::endl;
    delete[] data;


    return 0;
}

输出:

1

2

2

特别注意:如果形参为指针时,在函数内部对其动态分配内存,是不能影响到外部的指针变量的,如下所示:

void test_ptr3(int* data){
    data = new int[10];
    // data[1] = 1;
    data[1] = 1;
    std::cout<<data[1]<<std::endl;
}
int main() {

    int* data = nullptr;
    test_ptr3(data);
    std::cout<<data[1]<<std::endl;//error

    return 0;
}

输出:

1
段错误 (核心已转储)

3. 形参为指针的指针,实参为指针变量的地址

这里可以支持在函数内部对外部的空指针进行动态分配内存

void test_ptr2(int** data){
    *data = new int[10];
    (*data)[1] = 1;
}
int main() {

    int* data = nullptr;
    test_ptr2(&data);
    std::cout<<data[1]<<std::endl;
    delete[] data;
    return 0;
}

输出为:

1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值