C语言 函数值传递和址传递

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门


一.简介

函数声明只是一个空壳,不会有具体的函数实现,而定义要实现函数的实现,例如:


1.函数声明:不需要实现这个函数的功能

int sub(int x,int y); //只需要声明即可,不需要实现这个函数的功能

2.函数定义:必须实现这个函数的功能

int sub(int x,int y) ////需要实现这个函数的功能
{
    return (x-y);
}

3.函数调用:调用之前必须先声明或者定义

函数在调用之前必须声明或者定义,否则会报错:找不到标识符,这也是为什么 hello world 中调用 printf 函数必须要包含 stdio.h 头文件的原因;


二.函数值传递

C 语言中,函数的参数传递方式有两种:值传递与地址传递。

值传递:使用变量、常量、数组元素作为函数参数,在调用结束后,形参值的任何变化都不会影响到实参的值举个例子:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数值传递和址传递
//@Time:2021/06/20 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/ 

#include <stdio.h>
void func(int x, int y)
{
    x = 100;
    y = 200;
    printf("func:x = %d, y = %d\n", x, y);
}
int main(void)
{
    int a=10;
    int b=20;
     /*变量a、b为func函数的实际参数*/
    func(a, b);
    printf("main:a = %d, b = %d\n", a, b);
    return 0;
}
/*
输出:
func:x = 100, y = 200
main:x = 10, y = 20
*/

main 函数中调用 func 函数,以整数类型 ab 作为实参传递,虽然在 func 函数中形参 xy 值发生改变,但是并以不会影响 main 函数中 ab 的值,这就是所谓的值传递;


三.函数址传递

C 语言中,函数的参数传递方式有两种:值传递与地址传递

址传递:使用指针变量或者内存地址作为函数参数,在调用结束后,实参跟随形参一起变化。举个例子:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数值传递和址传递
//@Time:2021/06/20 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/ 

#include <stdio.h>
void func(int *x, int *y)
{
    *x = 100;
    *y = 200;
    printf("func:x = %d, y = %d\n", x, y);
}
int main(void)
{
    int a=10;
    int b=20;
     /*分别对变量a、b取地址,并作为func函数的实际参数*/
    func(&a, &b);
    printf("main:a = %d, b = %d\n", a, b);
    return 0;
}
/*
输出:
func:x = 100, y = 200
main:x = 100, y = 200

main 函数中调用 func 函数,分别对变量 ab 取地址,并作为 func 函数的实参传递,由于形参 x 和实参 a,形参x和实参 a 指向同一个内存地址,在 func 函数中形参 xy 值发生改变,main 函数中 ab 的值也会跟着一起改变,这就是所谓的址传递;

四.函数值传递和址传递区别

  • 值传递:实参是传递的值,并非地址,形参的值发生改变,实参不受影响;
  • 址传递:实参是传递的地址,并非值,形参的值发生改变,实参会跟着一起改变(因为实参和形参都是指向同一块内存地址);

五.猜你喜欢

  1. C语言逻辑运算符
  2. C语言三目运算符
  3. C语言逗号表达式
  4. C语言 sizeof 和 strlen 函数区别
  5. C语言 strcpy 和 strcpy_s 函数区别
  6. C语言 memcpy 和 memcpy_s 区别
  7. C语言 数组定义和使用
  8. C语言 数组遍历
  9. C语言 数组下标越界
  10. C语言 数组内存溢出
  11. C语言 数组下标越界和内存溢出区别
  12. C语言 二维数组定义和使用
  13. C语言 二维数组行数和列数计算
  14. C语言 指针声明和定义
  15. C语言 指针 p++ / p–
  16. C语言 p++/(p)++/(p++)/p++
  17. C语言 使用指针遍历数组
  18. C语言 指针和数组区别
  19. C语言 数组指针
  20. C语言 指针数组
  21. C语言 指针数组和数组指针区别
  22. C语言 空指针 NULL
  23. C语言 void 指针
  24. C语言 野指针
  25. C语言 函数声明和定义
  26. C语言 函数声明和调用
  27. C语言 函数值传递和址传递

未经允许不得转载:猿说编程 » C语言 函数值传递和址传递
喜欢(2) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏