Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

5.2. Область видимости переменных

5.2.1. Локальные переменные

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

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

#include <stdio.h>

float convert(float); //Прототип функции

void main()

{

float TempFer,TempCel; //Объявление переменных типа float

printf(“Ведите температуру по Фаренгейту: ”);

scanf (“%f”,&TempFer);

TempCel=Convert(TempFer); //Вызывается функция и значение,

//возвращаемое ей, присваивается

//переменной TempCel

printf(“/nЭто температура по Цельсию: ”);

printf(“%f”,TempCel);

}

float convert(float fer) //Определение функции

{

float cel;

cel = ((fer – 32) * 5) / 9;

return cel;

}

5.2.2. Глобальные переменные

Переменные, определённые вне тела какой-либо функции, имеют глобальную область видимости и доступны из любой функции в программе. Локальные переменные, имена которых совпадают с именами глобальных переменных, не изменяют значений последних. Если в функции есть переменная с тем же именем, что и у глобальной, то при использовании внутри функции это имя относится к локальной переменной, а не к глобальной.

#include <stdio.h>

void myFunc(); //прототип функции

int x = 5, y = 7; //объявление глобальных переменных

void main()

{

printf(“x from main: %d”,x);

printf(“\n y from main: %d”,y);

myFunc();

printf(“\n Return from myFunc \n”);

printf(“x from main: %d”,x);

printf(“\n y from main: %d”,y);

}

void myFunc()

{

int y = 10, x = 15;

printf(“\n x from myFunc: %d”,x);

printf(“\n y from myFunc: %d”,y);

}

Результат:

x from main 5

y from main 7

x from myFunc 15

y from myFunc 10

Return from myFunc

x from main 5

y from main 7

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

5.3. Передача параметров в функцию

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

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

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

void perestan(int x, int y);

void perestanP(int *x, int *y);

void perestanM(int b[]);

void main()

{

clrscr();

int a[2] = {4,5}, x = 4, y = 5;

perestan(x,y);

printf("После использования perestan() значения х и у: %d %d", x, y);

perestanP(&x,&y);

printf("\n После использования perestanP значения х и у: %d %d", x, y);

perestanM(a);

printf("\n После использования perestanM значения a[0] и a[1]: %d %d",

a[0], a[1]);

getche();

}

void perestan(int x, int y)

{

int temp;

temp = x;

x = y;

y = temp;

}

void perestanP(int *x, int *y)

{

int temp;

temp = *x;

*x = *y;

*y = temp;

}

void perestanM(int b[]);

{

int temp;

temp = b[0];

b[0] = b[1];

b[1] = temp;

}

Результат:

После использования Perestan значения х и у: 4 5 – значения x и y не поменялись, т.к. просто копировалось значение параметра в функцию.

После использования PerestanP значения х и у: 5 4 – значения поменялись, т.к. в функцию уже передавались адреса этих параметров

После использования PerestanM значения a[0] и a[1]: 5 4 - В данном случае пересылается копия адреса массива а, массива b не существует. Запись в int b[] создаёт не массив, а указатель на массив.