2013-11-20 3 views
0

Так что в моем файл Си У меня есть переменная:статические переменные в C File

static int32_t currentAddress = 0x00000000; 

Мне было интересно, если я использую currentAddress установить поля внутри скажем STRUCT А, как 0. Тогда сказать, что приращение currentAddress в другом месте, изменится ли поле внутри А?

В принципе, я не понимаю, что статично в этом случае и когда его использовать.

+2

in C 'static' - всего лишь оператор определения области видимости, переменная' currentAddress' видна только в текущем файле. Если поле внутри 'struct A' является' int32_t', оно не изменится, если вы измените 'currentAddress'. –

+0

Лучше вообще не иметь статических переменных. – piokuc

+1

Прошу прощения ... почему лучше не иметь статических переменных? Возможно, вы имеете в виду, что лучше не иметь переменных уровня модуля. Но если у вас их есть, есть веские причины предпочесть, что они статичны. –

ответ

2

Поле в пределах A получит текущее значение currentAddress, которое равно 0. Изменение currentAddress позже не повлияет на поле A, если вы снова не назначили поле currentAddress, и в этот момент поле A будет иметь новое значение currentAddress.

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

+0

это в области файлов. благодаря! –

1

В случае, если вы упомянули, valie копируется из currentAddress в переменную, которую вы назначаете. Таким образом, изменение значения currentAddress не изменит другие значения.

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

int foo(){ 
    int a = 0; 
    a++; 
    return a; 
} 

int bar(){ 
    static int a = 0; 
    a++; 
    return a; 
} 

Каждый вызов Foo() возвращает 1, поскольку переменная а создается, увеличивается, вернулся и уничтожены. Но каждый вызов bar() увеличивает возвращаемое значение (он возвращает 1 первый раз, затем 2, 3, 4 и т. Д.), Потому что переменная больше не уничтожается. Также обратите внимание, что правила доступа к переменной сохраняются: к строке «a» не удается получить доступ за пределами функции бара.

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