C语言 结构体struct值传递和址传递(七)

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

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 面向对象

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 设计模式

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ STL

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 技术杂谈

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 常用函数


一.结构体struct前言

  1. C语言 结构体struct简介(一)
  2. C语言 结构体struct定义和使用(二)
  3. C语言 结构体struct数组(三)
  4. C语言 结构体struct指针(四)
  5. C语言 结构体struct成员函数(五)
  6. C语言 结构体struct嵌套(六)
  7. C语言 结构体struct值传递和址传递(七)

二.函数值传递和址传递

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


1.函数值传递

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

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数值传递和址传递
//@Time:2021/11/10 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 的值,这就是所谓的值传递;


2.函数址传递

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

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 函数值传递和址传递
//@Time:2021/11/10 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.结构体值传递

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

#include <stdio.h>

//结构体计算矩形面积或者周长
typedef struct RECT
{
    int width;
    int height;
    
}RECT;

void func(RECT rect)
{
    rect.width = 10;
    rect.height = 20;
    printf("func:width = %d, height = %d\n", rect.width, rect.height);
}
int main(void)
{
    RECT rt = {100,200};
     /*变量a、b为func函数的实际参数*/
    func(rt);
    printf("main:width = %d, height = %d\n", rt.width, rt.height);
    return 0;
}
/*
func:width = 10, height = 20
main:width = 100, height = 200
*/

实参是传递的值,并非地址,形参的值发生改变,实参不受影响;


2.结构体址传递

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


#include <stdio.h>

//结构体计算矩形面积或者周长
typedef struct RECT
{
    int width;
    int height;
    
}RECT;

void func(RECT *rect)
{
    rect->width = 10;
    rect->height = 20;
    printf("func:width = %d, height = %d\n", rect->width, rect->height);
}
int main(void)
{
    RECT rt = {100,200};
     /*变量a、b为func函数的实际参数*/
    func(&rt);
    printf("main:width = %d, height = %d\n", rt.width, rt.height);
    return 0;
}

/*
func:width = 10, height = 20
main:width = 10, height = 20
*/

实参是传递的地址,并非值,形参的值发生改变,实参会跟着一起改变


四.值传递和址传递区别

值传递:实参是传递的值,并非地址,形参的值发生改变,实参不受影响;

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


五.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. C语言 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 #运算符
  16. C语言 ##运算符
  17. C语言 __VA_ARGS__
  18. C语言 ##__VA_ARGS__
  19. C语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C语言 va_start / va_end / va_arg 自定义 printf 函数
  21. C语言 main 函数参数 main(int argc, char *argv[])
  22. C语言 全局变量和局部变量区别
  23. C语言 static
  24. C语言 extern
  25. C/C++ Unicode 和多字节区别
  26. C/C++ wprintf 输出中文乱码
  27. C/C++ char 和 wchar_t 相互转换
  28. C/C++ NaN(Not a Number)
  29. C语言 枚举enum简介(一)
  30. C语言 枚举enum声明变量和使用(二)
  31. C语言 共用体union
  32. C语言 结构体struct简介(一)
  33. C语言 结构体struct定义和使用(二)
  34. C语言 结构体struct数组(三)
  35. C语言 结构体struct指针(四)
  36. C语言 结构体struct成员函数(五)
  37. C语言 结构体struct嵌套(六)
  38. C语言 结构体struct值传递和址传递(七)

未经允许不得转载:猿说编程 » C语言 结构体struct值传递和址传递(七)
喜欢(0) 打赏

评论抢沙发

评论前必须登录!

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

开始学习

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

支付宝扫一扫打赏

微信扫一扫打赏