如果我使用全局变量作为函数的参数,函数是否能够更改全局变量的值?
如果我定义了一个全局变量,并使用一个函数来改变该变量的值,那么该变量的新值会在函数返回后保留吗?
因此,如果我使用全局变量作为函数的参数函数是否能够更改全局变量的值?
否,您将无法更改用作函数参数参数的全局变量。函数参数获取全局变量的副本。它本身(参数)是函数的局部变量。局部变量的任何更改都不会影响原始参数,因为函数处理全局变量值的副本。
如果我定义了一个全局变量,并且我使用了一个函数来更改该变量的值,该变量的新值会保留吗函数返回后?
如果函数通过指向用作函数参数的全局变量的指针直接或间接处理全局变量,则函数可以更改全局变量的值。
考虑以下演示程序
#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 = %dn", x);
f(x);
printf("After calling f( x ) - x = %dnn", x);
printf("Before calling g( &x ) - x = %dn", x);
g(&x);
printf("After calling g( &x ) - x = %dnn", x);
printf("Before calling h() - x = %dn", x);
h();
printf("After calling h() - x = %dnn", 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将等于CCD_ 1。
如果您将变量的地址作为函数的参数传递,并且如果您对其进行任何更改,是的,它将被更改。同样,对于全局变量,您不必将它们传递到函数中,您可以在任何函数中使用它们并进行更改,因为它们是全局的。
如果将实参命名为与全局变量相同的实参,则由形式实参创建的局部变量将覆盖全局变量,并且在函数内部,它们的作用域和使用范围最接近,更改不会更改全局变量。
例如,考虑以下程序:
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
的值已更改为7
。