【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;//errorreturn 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