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

时间:2017-01-03 16:15:47

标签: c function global-variables

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

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

3 个答案:

答案 0 :(得分: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;
}

它的输出是

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

另一个有趣的案例

请考虑以下代码段

int x = 10;

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

//...

h( x++ );

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

x += value;

x将等于21

答案 1 :(得分:5)

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

答案 2 :(得分:2)

如果您将参数命名为与全局变量相同,那么由形式参数创建的局部变量将 shadow 全局变量,并且在函数内部它们将在范围内最接近并使用,改变不会改变全局变量。

例如,请考虑以下程序:

int a = 1;
int b = 2;

void f(int a, int c);

int main(void)
{
    f(a, b);  // Pass the global variables
    return 0;
}

void f(int a, int c)
{
    a = 5;  // Changes the local variable a, not the global variable
    c = 6;  // Changes the local variable c
    b = 7;  // Changes the global variable
}

在调用函数f之后,全局变量a的值仍为1,但b的值已更改为{{1 }}