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

最后更新于:2020-09-09 21:29:03

一.简介

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

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

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

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

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

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

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

二.函数值传递

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

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

#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语言中,函数的参数传递方式有两种:值传递与地址传递

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

#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. 指针和数组区别

2. 指针数组

3. NaN(Not a Number)

4. memcpy/strcpy/strcpy_s 区别

5. unicode 和多字节区别

6. 数组定义和使用

7. sizeof和strlen函数区别

8. Debug和_DEBUG区别

9. _WIN32/WIN32/_WIN64/WIN64区别

10. 判断exe可执行程序是32位的还是64位

11. 数组下标越界

12. 数组内存溢出

13. 数组下标越界和内存溢出区别

14. 二维数组行数和列数计算

15. 指针声明和定义

16. 指针p++/p-–



转载请注明: 猿说编程 » C/C++教程 » 函数值传递和址传递

赞赏

微信赞赏支付宝赞赏