/ / Wykorzystanie zmiennych globalnych jako argumentów funkcji - c, funkcja, zmienne globalne

Używanie zmiennych globalnych jako argumentów dla funkcji - c, function, global-variables

Więc jeśli użyję zmiennych globalnych jako argumentów funkcji, czy funkcja będzie w stanie zmienić wartość zmiennej globalnej?

A jeśli zdefiniowałem zmienną globalną i użyłem funkcji do zmiany wartości tej zmiennej, czy nowa wartość tej zmiennej pozostanie po powrocie funkcji?

Odpowiedzi:

6 dla odpowiedzi № 1

Więc jeśli użyję zmiennych globalnych jako argumentów funkcji, to czy funkcja może zmienić wartość zmiennej globalnej?

Nie, nie będziesz mógł zmienić globalnegozmienna używana jako argument parametru funkcji. Parametr funkcji otrzymuje kopię zmiennej globalnej. Sama (parametr) jest lokalną zmienną funkcji. Wszelkie zmiany zmiennej lokalnej nie wpływają na oryginalny argument, ponieważ funkcja zajmuje się kopią wartości zmiennej globalnej.

A jeśli zdefiniowałem zmienną globalną i użyłem funkcji do zmiany wartość tej zmiennej, czy nowa wartość tej zmiennej pozostanie po powrocie funkcji?

Jeśli funkcja dotyczy zmiennej globalnejbezpośrednio lub pośrednio poprzez wskaźnik do zmiennej globalnej używanej jako parametr funkcji, wówczas wartość zmiennej globalnej może zostać zmieniona przez funkcję.

Rozważ następujący program demonstracyjny

#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;
}

Jego wydajność jest

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

Jeszcze jedna ciekawa sprawa

Rozważ następujący fragment kodu

int x = 10;

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

//...

h( x++ );

Tutaj jest punkt sekwencji po ocenie argumentów funkcji. Zatem wewnątrz funkcji zmienna globalna będzie miała wartość 11, w wyniku czego otrzymasz ją po tej instrukcji

x += value;

x będzie równe 21.


5 dla odpowiedzi nr 2

Jeśli podasz adres zmiennej jakoparametr funkcji i jeśli dokonasz jakiejkolwiek zmiany tak, zostanie on zmieniony. Również dla zmiennych globalnych nie musisz przekazywać ich do funkcji, możesz używać ich w dowolnej funkcji i zmieniać, ponieważ są globalne.


2 dla odpowiedzi nr 3

Jeśli nazwa argumentów będzie taka sama jak zmiennych globalnych, zmienne lokalne utworzone przez argumenty formalne będą takie same cień zmienne globalne, a wewnątrz funkcji będą one najbliższe w zakresie i użyte, a zmiana nie zmieni zmiennych globalnych.

Rozważmy na przykład następujący program:

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
}

Po funkcji f została wywołana wartość zmiennej globalnej a nadal będzie 1 ale wartość b został zmieniony na 7.