- •2.2.Функции, возвращающие значение
- •Void main ()
- •Void Sum(float *s,float *X, int n)
- •Void main ()
- •Void Sumstmatr ( float (*mz)[m], float *mx, int n1, int m1); //прототип функции Sumstmatr
- •Void main ()
- •Void Sumstmatr (float (*mz)[m], float *mx, int n1, int m1)
- •Void main ()
- •Void main()
- •2.3. Функции обработки строк
- •Void strcpy ( char *s, char *t)
- •Void strcpy ( char *s, char *t)
- •Int strcmp ( char * s, char * t)
- •Unsigned strlen (const char *str );
- •Void strcpy (char *s,char *t);
- •Void main ()
- •Int Vs(char *s, char *sl, int d);
- •Int Vs(char *s,char *sl, int d) // функция формирования очередной строки
- •2.4. Рекурсивные функции
- •Void main()
- •3.Классы памяти и области действия описаний
- •Автоматические переменные
- •Внешние переменные
- •Void main ()
- •Void main ()
- •Int a[4]; // указано, что а – локальный массив целого типа
- •Void main ()
- •Статические переменные
- •Void f();
- •Void main ()
- •Void f()
- •Регистровые переменные
- •4.Элементы структурного программирования
- •4.1.Нисходящая разработка
- •4.2.Основные структуры, пошаговая детализация
- •Void main ()
- •Void main ()
- •Void Smog (long mz[][n2]);
- •Void main ()
- •Void Smog (long mz[][n2])
- •4.3.Сквозной структурный контроль
- •Элементы, которые должны проверяться на контрольных сессиях
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.