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

33. Указатели и одномерные массивы

В языке C понятие массива тесно связано с понятием указателя. Имя массива представляет адрес первого элемента массива. Это значит что допустимо следующее действие:

int a[100], *p;

p = a;

Однако имеется два существенных отличия массива от указателя:

- при описании массива память выделяется для хранения всех его элементов, а указателю только для хранения адреса;

- адрес массива навсегда закреплен за именем массива (имя - адресная константа), в то время, как значение указателя можно поменять.

34. Указатели и двумерные массивы

Пусть имеются следующие определения массивов и указателей:

int A[4][2], B[2];

int *p, (*pA)[4][2], (*pAstr)[2];

Объявлен массив А из 4-х строк, 2-х столбцов, массив b из 2-х целых элементов, указатель на целые числа p, указатель на массив из 4х строк 2 столбцов целых элементов и указатель pastr на массив из 2х элементов.

pA=&А;

pАstr=А;

pАstr[0][0]=5;

(*pastr)[0]=5;

35. Указатели и функции

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

double sin(double);

double cos(double);

double tan(double);

double (*pf)(double);

pf - представляет собой указатель на функцию с вещественным аргументом и возвращающую вещественное число.

36. Оператор typedef

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

typedef double dArray[100];

Новый тип описывается аналогично переменной. Но описанное имя трактуется как название нового типа (память при этом не выделяется).

DArray a,b;// a и b - массивы из 100 элементов типа double

typedef double (*Fun)(double);

Fun fnArray[3]={sin,cos,tan}

39. Области видимости и глобальные данные

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

2)файловая(внутри файла)

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

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

40. Время жизни переменных и классы памяти языка Си

Время жизни переменных программы определяется классом памяти, которую в языке Си выделяют 3

1) статические (static), 2)автоматические (auto) и 3)динамические данные.

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

Локальную переменную можно сделать статической, используя ключевое слово static.

Автоматические переменные создаются на стеке, каждый раз при входе в локальный блок, где они объявлены, и уничтожаются при выходе из этого блока. При этом, в зависимости от загрузки/состояния стека их адрес может отличаться. Для обозначения автоматических данных используется ключевое слово auto, но так как локальные данные по умолчанию имеют этот класс, то его писать не обязательно.

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

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