函数的参数与传参
时间:2023-04-16 08:37:00
目录
-
- 函数的参数
- 调用带实际参数的函数
- 参与形参的关系
- 传参
- const使用函数形参const,保护主调函数的实参数据
-
- 修饰函数中的形参
- const指针或普通指针的区别
- 函数传参的原:
- const修饰字符串
函数的参数
函数头中定义的参数称为函数形式参数,称为形式参数。
与函数代码块中定义的变量一样,形参也是局部变量,属于函数私有。
在其他函数中使用同名变量不会引起冲突。每次调用函数,都会给形参赋值。
调用带实际参数的函数
实际参数简称实参,是主调函数赋值给被调函数的具体值。
实际参数可以是变量、常量或表达式。
无论实际参数是什么形式,都要求值,将值复制到被调函数的形参。
参与形参的关系
实参是具体值,形参的值从实参的计算结果中复制。
除非传址(特殊传值),否则被调函数对复制数据的操作不会影响主调函数中的原始数据。
传参
C使用语言的所有参数 传值调用 通过传输方式,调整函数的形状参数将获得实际参数的副本。这样,调整函数就可以放心地修改此副本值,而不用担心将其修改到主调整函数中的参数。
但是如果传递的参数是一个数组名,在被调函数中使用数组下标对数据元素进行修改,这样主调函数中的参数也会被修改。数组并未被复制到形参中,这种行为被称为“传址调用”,但它在本质上讲并不违背 传值调用 原则。传址也是一种特殊的传值。详见博客《数组名作为函数参数》
数组名或指针作为参数传输,它们本身的值实际上是指针,调整函数的形状参数是该指针的副本。下标引用(即使用中括号[])实际上是间接访问的另一种形式。使用它可以对指针进行间接访问操作,访问指针指向的内存位置,并访问值得复制的原始数组。
const使用函数形参const,保护主调函数的实参数据
修饰函数中的形参
指向常量指针通常用于函数的形参,表明函数不会使用指针来改变要处理的数据。主调函数中的数据内容不会通过函数形参来修改。
举例:
float rate_turn_fun(const float* mifer, int num) {
int i; float total_fer; for(i = 0; I <10;i ) {
total_fer = mifer[i]; 正确 total_fer = *(mifer i); 正确 } *mifer = total_fer; 错误,使用mifer只能访问数据,不能修改数据 return total_fer; }
这样使用const主调函数中的原数组不需要常量,而是在被调函数中,在处理该数组时,将其视为常量,不能更改。这样使用const主调函数中的数组数据可以保护不被修改。const修改形参,函数不能修改数组名或指针。
但是对于基本类型,这个const这是没有意义的,因为当实参传递给形参时,它本身就是一种副本,不会改变原实参的值。
主调函数通过实参传递给被调函数的形参的值是一份副本。但是,如果副本是内存地址,则可以直接操作内存地址以改变内存值。
这就是我们常说的,如果用指针传递参数,除非你想看到,否则要小心修改主调函数的数据。
这也印证了我们之前博客《什么是机器语言…》C语言的第五个优点。
const指针或普通指针的区别
把const数据或非const数据地址初始化为指向const指针或赋值是合法的。然而,我们只能使用非指针const将数据的地址赋值给普通指针,将const数据地址赋值给普通指针,结果未定义,未知。
举例:
int xuqi[5] = {
1,9,8,3,6};
const heli[5] = {
1,2,10,5,6};
rate_turn_fun(xuqi,5); 有效
rate_turn_fun(heli,5); 有效
如果有函数
void rate_manage_fun(float* mifer, int num);
则:
rate_manage_fun(xuqi,5); 有效
rate_manage_fun(heli,5); 不能这样传参,会出现未知结果。
函数传参的原则:
函数无法访问其他函数中的变量,这种限制访问保护了数据的完整性。但是,当切实需要在函数中访问另一个函数内的数据时(修改),可以把指针作为函数的参数。
const修饰字符串
const char * pc = "Behold a string literal!";
程序根据该声明把相应的字符串存储在内存中,内含这些字符值的字符串就是一个对象。
由于字符串字面量中的每个字符都能被单独访问,所以每个字符也是一个对象。
该声明还创建了一个标识符为pc的对象,存储着字符串的地址。
由于可以设置pc重新指向其他字符串,所以标识符pc是一个可修改的左值。const只能保证被pc指向的字符串内容不被修改,但是无法保证pc不指向别的字符串。
指针的值可以修改,指向的内容不可修改!!!
见博客《const关键字,常量指针与指针常量》
由于* pc指定了存储 ‘B’ 字符的数据对象,所以 *pc是一个左值,但不是一个可修改的左值。
以此类似,因为字符串字面量本身指定了存储字符串的对象,所以它也是一个左值,但不是可修改的左值。