使用全局变量作为函数的参数

Jus*_*han 0 c function global-variables

因此,如果我使用全局变量作为函数的参数,函数是否能够更改全局变量的值?

如果我定义了一个全局变量,并且我使用了一个函数来改变该变量的值,那么该函数的新值是否会在函数返回后保留?

Vla*_*cow 6

因此,如果我使用全局变量作为函数的参数,函数是否能够更改全局变量的值?

不,您将无法更改用作函数参数的参数的全局变量.function参数获取全局变量的副本.它本身(参数)是函数的局部变量.局部变量的任何更改都不会影响原始参数,因为该函数处理全局变量值的副本.

如果我定义了一个全局变量,并且我使用了一个函数来改变该变量的值,那么该函数的新值是否会在函数返回后保留?

如果函数直接或间接通过指向用作函数参数的全局变量的指针处理全局变量,则函数可以更改全局变量的值.

考虑以下示范程序

#include <stdio.h>

int x = 10;

void f(int x)
{
    x = 20;
}

void g(int *px)
{
    *px = 30;
}

void h()
{
    x = 40;
}

int main(void)
{
    printf("Before calling f( x ) - x = %d\n", x);
    f(x);
    printf("After calling f( x ) - x = %d\n\n", x);

    printf("Before calling g( &x ) - x = %d\n", x);
    g(&x);
    printf("After calling g( &x ) - x = %d\n\n", x);

    printf("Before calling h() - x = %d\n", x);
    h();
    printf("After calling h() - x = %d\n\n", x);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的输出是

Before calling f( x ) - x = 10
After calling f( x ) - x = 10

Before calling g( &x ) - x = 10
After calling g( &x ) - x = 30

Before calling h() - x = 30
After calling h() - x = 40
Run Code Online (Sandbox Code Playgroud)

另一个有趣的案例

请考虑以下代码段

int x = 10;

void h( int value )
{
    x += value;
}

//...

h( x++ );
Run Code Online (Sandbox Code Playgroud)

这里在评估函数参数后有一个序列点.因此,在函数内部,全局变量将具有值11,因此您将在此语句之后获得该值

x += value;
Run Code Online (Sandbox Code Playgroud)

x将等于21.


小智 5

如果您将变量的地址作为函数的参数传递,并且如果您对其进行任何更改,则会更改它.此外,对于全局变量,您不必将它们传递给函数,您可以在任何函数中使用它们并进行更改,因为它们是全局变量.