2013-09-17 2 views
1

Я изучал статическую переменную, и я натолкнулся на этот код на википедию. Статический int x сохраняет это значение во всей программе. И даже когда мы объявляем его глобально, он сохранит предыдущие значения. Означает ли это, что статические и глобальные переменные рассматриваются как одни и те же. А если нет, то как они работают?Объявление глобальной и статической переменной

#include <stdio.h> 

void func() { 
     static int x=0; 
     // x is initialized only once across three calls of func() 
     printf("%d\n", x); // outputs the value of x 
     x = x + 1; 
} 

int main(int argc, char *argv[]) { 
     func(); // prints 0 
     func(); // prints 1 
     func(); // prints 2 
     return 0; 
} 

ответ

0

Да, они оба почти одинаковы. Переменные, объявленные static внутри функции, могут ссылаться/использоваться только этой функцией.

Это полезно для ограничения области действия переменной, которую использует только эта конкретная функция. Нет смысла создавать глобальную переменную, которая используется только одной функцией. Это делает вашу программу менее ясной.

0

Да, статическая переменная хранится точно так же, как глобальная переменная. Его ценность будет сохраняться на протяжении всей жизни программы.

Ключевое слово static также влияет на область действия переменной, если она объявлена ​​вне функции. К переменной нельзя обращаться по имени из другого исходного файла.

0

Global vs local больше о доступности. Статические переменные экземпляра различаются, поскольку они связаны с тем, как хранятся данные. Статические данные хранятся на уровне типа, что означает, что он разделяется между всеми переменными определенного типа. С другой стороны, переменные экземпляра связаны с конкретным экземпляром и уникальны для экземпляра.

2

В функции и глобальной переменной есть сходство между переменной static. Оба имеют продолжительность жизни, которая совпадает с жизнью программы в целом. Это означает, что любые изменения, внесенные в статическую переменную в функции, сохраняются между вызовами функции.

Большая разница, однако, состоит в том, что статическая переменная в функции может быть доступна только по имени из этой функции. Если функция делает указатель доступным для другого кода, к нему можно получить доступ через указатель. Но в остальном он скрыт внутри функции, а другие функции могут иметь статическую переменную с тем же именем, и может существовать переменная области видимости файла с тем же именем (которая будет скрыта внутри функции).

В отличие от этого, глобальная переменная доступна по имени в любом месте, где она объявлена ​​- потенциально в нескольких исходных файлах.

1

Изменили свой код, чтобы иметь как глобальные, так и статические переменные.

#include <stdio.h> 

int z;    // can be accessed by other modules 
static int y;  // can only be used by this source module 

void func() { 
     static int x=0; 
     // x is initialized only once across three calls of func() 
     printf("%d %d\n", x); // outputs the value of x 
     x++; 
     y++; 
} 

int main(int argc, char *argv[]) { 
     y = 3; 
     func(); // prints: 0 3 
     func(); // prints: 1 4 
     func(); // prints: 2 5 
     return 0; 
} 

y сохраняется и доступна из обоих main и func. x сохраняется, но может быть прочитано только с func. z может быть прочитан из другого кода в других исходных модулях, если они заявляют: extern int z;.

0

Это классический вопрос о сфере видимости и времени жизни переменной.

Объем переменной - это диапазон, по которому эта переменная может быть указана или доступна. Область может быть в пределах определенной функции или целого файла или всей программы.

С другой стороны, время жизни переменной равно тому, как долго переменная сохраняет свое пространство в памяти. Время жизни может быть ограничено вызовом функции или полным исполнением программы.

Исходя из этих факторов, также изменяется местоположение переменной. Например, локальная переменная занимает пространство в стеке. Однако, если эта локальная переменная имеет спецификатор static, то эта переменная занимает пространство в разделе данных, однако привязка (или видимость) находится только внутри функции, где она объявлена. Таким образом, когда вызов функции завершен, он не теряет свое текущее значение, но может быть доступен только тогда, когда внутри функции.

С другой стороны, глобальная переменная имеет область действия всего файла, в которой она определена, и занимает пространство в разделе данных.

Итак, как вы видите выше, как статические, так и глобальные переменные занимают пространство в разделе данных, но их связь с программой различна, т. Е. Функция и весь файл соответственно. Надеюсь, это поможет!

Лучшей ссылкой для этого вопроса будет «Язык программирования C».

3

Спецификатор static имеет несколько иное значение в зависимости от того, где вы его используете. У вас есть 3 варианта объявления переменной, значение которой вы хотите сохранить на протяжении всего жизненного цикла программы:

1) При объявлении переменной как static внутри функции (то есть локальной переменной) означает, что ее значение будет сохраняется между вызовами функций на протяжении всего жизненного цикла программы. Если вы инициализируете переменную значением, это начальное значение этой переменной при первом вызове функции; все последующие вызовы функций будут иметь значение переменной, сохраненной вместо повторной инициализации.

2) При объявлении глобальной переменной (без спецификатора static) ее значение сохраняется на протяжении всего жизненного цикла программы, как если бы это была локальная статическая переменная, но разница в том, что глобальная переменная видима (чтение и запись) любой функцией любого файла программы.

3) При объявлении глобальной переменной static ее значение снова сохраняется на протяжении всего жизненного цикла программы, но, в отличие от простых глобальных переменных, к ней могут быть доступны только другие функции в одном файле.

В заключение все эти три типа переменных сохраняют свою ценность; разница заключается в их объеме, что означает, какие функции имеют доступ к этой переменной.

Все 3 переменные из следующего кода сохраняют свое значение в течение всего срока службы программы.

int x = 100;   // visible to any function within any .c file of this program 
static int y = 5000; // visible from any function within this .c 
int func (int i) 
{ 
    static int z = 0;  // invisible to all other functions 
    x += i; 
    y += i; 
    z += i; 
    return z; 
} 

Подробное объяснение можно найти here.

Смежные вопросы