资讯详情

函数的参数与传参

目录

    • 函数的参数
    • 调用带实际参数的函数
    • 参与形参的关系
    • 传参
    • const使用函数形参const,保护主调函数的实参数据
      • 修饰函数中的形参
    • const指针或普通指针的区别
    • 函数传参的原:
    • const修饰字符串

函数的参数

函数头中定义的参数称为函数形式参数,称为形式参数。 与函数代码块中定义的变量一样,形参也是局部变量,属于函数私有。 在其他函数中使用同名变量不会引起冲突。每次调用函数,都会给形参赋值。

调用带实际参数的函数

实际参数简称实参,是主调函数赋值给被调函数的具体值。 实际参数可以是变量、常量或表达式。 无论实际参数是什么形式,都要求值,将值复制到被调函数的形参。

参与形参的关系

实参是具体值,形参的值从实参的计算结果中复制。 除非传址(特殊传值),否则被调函数对复制数据的操作不会影响主调函数中的原始数据。

传参

但是如果传递的参数是一个数组名,在被调函数中使用数组下标对数据元素进行修改,这样主调函数中的参数也会被修改。数组并未被复制到形参中,这种行为被称为“传址调用”,但它在本质上讲并不违背 传值调用 原则。传址也是一种特殊的传值。详见博客《数组名作为函数参数》

数组名或指针作为参数传输,它们本身的值实际上是指针,调整函数的形状参数是该指针的副本。下标引用(即使用中括号[])实际上是间接访问的另一种形式。使用它可以对指针进行间接访问操作,访问指针指向的内存位置,并访问值得复制的原始数组。

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!";

程序根据该声明把相应的字符串存储在内存中,内含这些字符值的字符串就是一个对象。 由于字符串字面量中的每个字符都能被单独访问,所以每个字符也是一个对象。

见博客《const关键字,常量指针与指针常量》

由于* pc指定了存储 ‘B’ 字符的数据对象,所以 *pc是一个左值,但不是一个可修改的左值。 以此类似,因为字符串字面量本身指定了存储字符串的对象,所以它也是一个左值,但不是可修改的左值。

标签: fer连接电缆meto

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台