Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
09.04.2015
Размер:
232.96 Кб
Скачать

Void main ()

{ int s;

extern int A[4];// указано, что А– внешний массив целого типа

clrscr();

printf("sumA=%d \n", Sum() );

s = A[0] + A[1];

printf (“s = %d\n”, s);

getch();

}

int Sum()

{int i, ss;

Int a[4]; // указано, что а – локальный массив целого типа

for (i = 0, ss = 0; i < 4; i++)

ss +=A[i];

return ss;

}

В этой программе А в функцииSum вовсе неА в функцииmain !А в функцииSumэто локальный для этой функции массив (см. предыдущую тему). И хуже всего то, что этот массив оказался не определенным! В результате при трансляции ошибки указано не будет, а при выполнении программы результат будет не предсказуем. Желаю вам не попадать в такие ситуации! Но, если в функцииSum нужно все – таки использовать массив с именемА? Возможный вариант представлен ниже:

#include <stdio.h>

#include <conio.h>

int Sum();

int A[4] = {1,4,6,7};// A- массив, описанный вне функции

Void main ()

{ int s;

extern int A[4];// указано, что А– внешний массив целого типа

clrscr();

printf("sumA=%d \n", Sum() );

s = A[0] + A[1];

printf (“s = %d\n”, s);

getch();

}

int Sum()

{int i, ss;

int A[4] = {1,1,1,1}; // указано, что А – локальный массив целого типа и // массив инициализируется

for (i = 0, ss = 0; i < 4; i++)

ss +=A[i];

return ss;

}

Если эту программу выполнить, то получим следующий результат:

SumA = 4

s = 5

Отсюда видно, что в этой программе в функцииSum иmain А – это разные массивы и результат верен.

Статические переменные

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

#include <stdio.h>

#include <conio.h>

Void f();

Void main ()

{ int i;

clrscr();

for(i =1; i < 4; i++ )

{

printf("итерация %d : ”, i );

F( ):

}

getch(); }

Void f()

{ int y = 1; //объявление и инициализация автоматической переменной

static int x =1;// объявление и инициализация статической переменной

printf (“x = %d y = %d \n”, x++ , y++ );

}

Если выполнить эту программу, то получим:

Итерация 1: x = 1 y =1 Итерация 2: x = 2 y =1

Итерация 3: x = 3 y =1

Анализируя этот результат, можно заметить, что от вызова к вызову функции F автоматическая переменнаяy не меняет своего значения, т. к. операторомint y = 1; для нее каждый раз выделяется новая ячейка и в нее посылается единица. В дальнейшем в операторе печати операторомy++ значениеy увеличивается на 1, но по окончании выполнения функции это значение исчезает вместе с ячейкой. Другое дело статическая переменная x. Для нее ячейка выделяется в специальной статической области памяти и эта ячейка существует, пока выполняется программа. Кроме того, инициализация для нее выполняется только один раз при первом входе в функциюF. Эти особенности статической переменной и объясняют полученный нами результат работы программы. Рассмотрим еще один вид статической переменной –внешней статической переменной, которая объявляется вне любой функции:

static x;// внешняя статическая переменная

float y()

{ ….

}

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

На рис.9 переменная х доступна функциямf1(), f2(), f3(). А переменнаяy доступна только функциямmain иf1.

Соседние файлы в папке attachments_05-09-2012_18-55-54