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

10.5. Поля бит в структурах

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

struct UniPopulation

{

int FIT:11;

int FEM:11;

int FEN:10;

};

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

10.6. Объединение

Объединения описываются аналогично структурам, но используется ключевое слово union.

union

{

int a;

long b;

}p;

p.b=10;

p.a=5;

printf(“%ld”,p.b)//мусор выведется

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

Глава 11. Дополнительные сведения о функциях

11.1. Области видимости.

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

  1. Локальная – внутри блока.

  2. Файловая – внутри файла

  3. Глобальная – по всей программе

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

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

#define N 15

int n=N

int main()

{

Пример:

#include <stdio.h>

int I=1;

void PrintI()

{

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

}

int main()

{

int i=10;

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

PrintI();

{

int i=100;

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

PrintI();

}

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

PrintI();

}

Программа выведет: i=10, i=1, i=100, i=1, i=10, i=1

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

Никогда не следует объявлять переменные глобальными, если на то нет веских причин. Все данные по функциям следует передавать в списке аргументов, а результаты возвращать return’ом.

Пример: посчитать сумму двумерного массива

#include <stdio.h>

int i;

int Sum(int A[],int n)

{

int s=0;

for(i=0,i<n,i++)

{

S+=A[i];

return s;

}

int main()

int B[3][2]={{1,1},{2,2},{3,3}};

int S=0;

for(i=0,i<n,i++)

{

S+=Sum(S[i],2);

}

}

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

SYSTEMPAUSE;

return 0;

Программа выведет s=2

Т.к. на первом витке цикла функции main, функция Sum вернет 2, но при этом i после функции станет равна 2. Затем выполнится i++, и проверка 3<3 окажется ложью и цикл на второй виток не пойдет.

Для того, чтобы переменная виделась из всех фалов вашего проекта, ее следует объявить глобально внутри какого-либо файла с исходным кодом. И в каждом файле, где мы хотели бы ее видеть дополнительно объявить ее с помощью ключевого слова extern.

Обычно объявление со словом extern заключают в заголовочный файл.

Пример:

//MyLib.h

#ifndef MY_LIB_H

#define MY_LIB_H

//Описание типов библиотеки

...

//Объявление глобальных переменных

extern double my_pi; //память не выделяется

//прототипы функций

//MyLib.spp

#include “MyLib.h”

//описание глобальных переменных

double my_pi=3,14;//выделяется память!

//описание функций

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

Пример использования переменных с файловым действием – настройки WinBGI.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]