Структура ПЭВМ. Размещение данных и программ в памяти ПЭВМ. Биты, байты. Программа, машинная команда

Структура ПЭВМ. Размещение данных и программ в памяти ПЭВМ. Биты, байты. Программа, машинная команда

ПЭВМ содержат клавиатуру, системный блок, и дисплей. Схема ПЭВМ представлена на рис. 1.

Структура ПЭВМ. Размещение данных и программ в памяти ПЭВМ. Биты, байты. Программа, машинная команда - student2.ru

- центральный процессор (ЦП), который осуществляет управление рабо­той и выполнение расчетов по программе; - оперативное запоминающее устройство (ОЗУ), в котором во время работы компьютера располагаются выполняемые программы (при выключении компьютера - очищается);- постоянное запоминающее устройство (ПЗУ), содержащее программы, необходимые для запуска компьютера;Данные и программы во время работы ПЭВМ размещаются в оперативной памяти, которая представляет собой последовательность пронумерованных ячеек. По указанному номеру процессор находит нужную ячейку, поэтому номер ячейки называется ее адресом. Минимальная адресованная ячейка (согласно стандарту IBM), с точки зрения программиста, состоит из 8 двоичных позиций, т.е. в каждую позицию могут быть записаны либо 0, либо 1. Объем информации, который помещается в одну двоичную позицию, называется битом. Объем информации, равный 8 битам, называется байтом.Программа – это последовательность команд (инструкций), которые помещаются в памяти и выполняются процессором в указанном порядке.

Специальные символы

Структура ПЭВМ. Размещение данных и программ в памяти ПЭВМ. Биты, байты. Программа, машинная команда - student2.ru Соединитель - используется при обрыве линии и продолжении ее в другом месте (необходимо

Структура ПЭВМ. Размещение данных и программ в памяти ПЭВМ. Биты, байты. Программа, машинная команда - student2.ru Терминатор - вход из внешней среды или выход во внешнюю среду (начало или конец схемы программы).

13.Базовые элементы языка Си. Алфавит. Лексемы. Знаки операций. Литералы. Комментарии.Алфавит языка Си включает:- прописные и строчные буквы латинского алфавита, а также знак подчеркивания (код ASCII 95);- арабские цифры от 0 до 9;- специальные символы:+(плюс) –(минус) *(звездочка) /(дробная черта) =(равно) >(больше) <(меньше) ;(точка с запятой) &(амперсант) [ ](квадратные скобки) { }(фигурные скобки) ()(круглые скобки) _(знак подчеркивания) (пробел) .(точка) ,(запятая) :(двоето­чие) #(номер) %(процент) ~(поразрядное отрицание) ?(знак вопроса) !(восклица­­тельный знак) \(обратный слеш).- пробельные (разделительные) символы: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка.ЛексемыИз символов алфавита формируются лексемы языка – минимальные значимые единицы текста в программе:- идентификаторы;- ключевые (зарезервированные) слова;- знаки операций;- константы;- разделители (скобки, точка, запятая, пробельные символы).Границы лексем определяются другими лексемами, такими, какразделители или знаки операций, а также комментариями. Знак операции – это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и тернарные операции, по количеству участвующих в них операндов. Литералы (константы)Когда в программе встречается некоторое число, например 1, то это число называется литералом или литеральной константой. Константой, потому что мы не можем изменить его значение, и литералом, потому что буквально передает свое значение (от латинского literal – буквальный).Литерал является неадресуемой величиной: хотя реально он, конечно, хранится в памяти машины, нет никакого способа узнать его адрес. Каждый литерал имеет определенный тип.. КомментарииЕще один базовый элемент языка программирования – комментарий, – не является лексемой. Внутри комментария можно использовать любые допустимые на данном компьютере символы, а не только символы из алфавита языка программирования, поскольку компилятор комментарии игнорирует.В Си комментарии ограничиваются парами символов /* и */, а в С++ был введен вариант комментария, который начинается символами // и заканчивается символом перехода на новую строку

14.Виды и характеристики языков программирования. Виды программных ошибок.В самом общем случае под ошибкой понимается какой-то сбой в программе на этапе ее выполнения. Ошибкой (или так называемым багом) можно назвать недокументированные или нежелательные, "побочные" реакции программы на те или иные действия пользователя равно как и при использовании ее одновременно с другим программами или на другой аппаратной платформе.Говоря простыми словами, программная ошибка - не что иное, как изъян в разработке программного продукта, который вызывает несоответствие ожидаемых результатов выполнения программного продукта и фактически полученных результатов. Дефект может возникнуть на стадии кодирования, на стадии формулирования требований или на стадии проектирования, либо же его причина может крыться в некорректной конфигурации или данных. Дефектом может быть также что-то другое, что не соответствует ожиданиям заказчика и что может быть, а может и не быть определено в спецификации программного продукта

15.Идентификаторы и ключевые слова языка Си.Идентификатор (в дальнейшем, для краткости - ID) – это имя программного объекта (константы, переменной, метки, типа, функции, модуля, поля в структуре). В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания; первым символом ID может быть буква или знак подчеркивания, но не цифра; пробелы внутри ID не допускаются.

Длина иденти­фикатора определяется реализацией (версией) транслятора Cи и редактора связей (компоновщика). Современная тенденция - снятие ограничений длины идентификатора.При именовании объектов следует придерживаться общепринятых соглашений:- ID переменной обычно пишется строчными буквами, например index (для сравнения: Index – это ID типа или функции, а INDEX – константа);- идентификатор должен нести какой-либо смысл, поясняя назначение объекта в программе, например birth_date (день рождения) или sum (сумма);- если ID состоит из нескольких слов, как, например birth_date, то принято либо разделять слова символом подчеркивания (birth_date), либо писать каждое следующее слово с большой буквы (birthDate).Разделители идентификаторов объектов:- пробелы; - символы табуляции, перевода строки и страницы;- комментарии (играют роль пробелов). Наличие разделителей не влияет на работу программы. В Си прописные и строчные буквы – различные символы. Идентификаторы Name, NAME, name – различные объекты. Ключевые (зарезервированные) слованемогутбытьиспользованывкачествеидентификаторов.КлючевыесловаСи:autoconstdoublefloatintshortstructunsignedvoidswitchsignedlongforelsecontinuebreakcasedefaultenumgotoregistersizeoftypedefvolatilewhileunionstaticreturnifexterndochar.

16.Структура программы на языке Си. Структура программы С изображена на рис. 1.1, здесь f1() — fN() означают функции, написанные программистом.Объявление глобальных переменныхintmain(список параметров)

{

последовательность операторов

}

тип_возвращаемого_значения f1(список п

{

последовательность операторов

}

тип_возвращаемого_значения f2(список п

{

последовательность операторов

} … тип_возвращаемого_значенияfN(список п

{

последовательность операторов

}

17. Декларация объектов. Основные типы данныхВсе объекты, с которыми работает программа в Си необходимо декларировать, т.е. объявить компилятору об их присутствии в программе. При этом возможны две формы декларации: - описание, не приводящее к выделению памяти;- определение, при котором под объект будет выделен объем оперативной памяти, в соответствии с его типом; в этом случае объект можно сразу инициализировать, т.е. задать его начальное значение.Кроме констант, которые можно задавать в исходном тексте, все объекты программы должны быть явно декларированы по следующему формату:<атрибуты><список ID объектов>;элементы списка разделяются запятыми, а атрибуты - разделителями. Например:inti,j,k; floata,b;

Объекты программы в общем случае имеют следующие атрибуты:

<класс памяти> - характеристика способа размещения объектов в памяти (статическая, динамическая), определяет область види­мости и время жизни переменной (по умолчанию - auto), данные атрибуты будут рассмотрены позже; <тип> - характеристика механизма интерпретации данных, т.е. это совокупность информации о том, сколько объекту нужно выделить памяти, какой вид имеет представление информации и какие действия над ней допустимы (по умолчанию - int).Класс памяти и тип – атрибуты необязательные и могут отсутст­во­вать, тогда их значения установятся по умолчанию.Примеры декларации простых объектов: inti,j,k;charr;doublegfd;Данные в языке Си разделяются на две категории: простые (скалярные), будем их называть базовыми, и сложные (составные) типы данных. Основные типы базовых данных: стандартный целый (int), веще­ствен­ный с одинарной точностью (float) и символьный (char). В свою очередь, данные целого типа могут быть короткими (short), длинными (long), и без знаковыми (unsigned), а вещественные - с удвоенной точностью (double).Сложные типы – массивы, структуры (struct), объединения или смеси (union), перечисление (enum).

18, 19.Категории типов данных (символьные, целые, с плавающей точкой)Плавающая запятая —форма представления действительных чисел, в которой число хранится в форме мантиссы и показателя степени. При этом число с плавающей запятой имеет фиксированную относительную точность и изменяющуюся абсолютную. Символьный тип (Char) - это тип данных, состоящих из одного символа (знака, буквы, кода). Значением типа Char может быть любой символ из набора ASCII. Если символ имеет графическое представление, то в программе он записывается заключенным в одиночные кавычки (апострофы)Целое, целочисленный тип данных (англ. Integer), в информатике — один из простейших и самых распространённых типов данных в языках программирования. Служит для представления целых чисел. Множество чисел этого типа представляет собой подмножество бесконечного множества целых чисел, ограниченное максимальным и минимальным значениями

Long l; // целый тип

Inti; // целыйтип

if (d > i) d = i;

if (i > l) l = i;

if (d == l) d *= 2;

явное приведение типов:int X;

int Y = 200;

char C = 30;

X = (int)C * 10 + Y; //переменная С приведена к типу int.

23. Системы счисления. Кодовая таблица ASCII. Классификация и преобразование символов.Система счисле́ния — символический метод записи чисел, представление чисел с помощью письменных знаков. Система счисления:

даёт представления множества чисел (целых и/или вещественных); даёт каждому числу уникальное представление (или, по крайней мере, стандартное представление); отражает алгебраическую и арифметическую структуру чисел. Системы счисления подразделяются на позиционные, непозиционные и смешанные.ASCII (англ. AmericanStandardCodeforInformationInterchange) — американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодовASCII представляет собой кодировку для представления десятичных цифр, латинского и национального алфавитов, знаков препинания и управляющих символов. Изначально разработанная как 7-битная, с широким распространением 8-битного байта ASCII стала восприниматься как половина 8-битнойКлассификация и преобразования символов в стандартной библиотеке С++ определены два фацета (функция) для работы с символами: ctype и codecvt. Оба фацета относятся к категории locale; :ctype. Фацет ctype используется в основном при классификации символов (например, проверки того, является ли символ буквой). Кроме того, в нем предусмотрены методы смены регистра символов, а также преобразования между char и типом символов, для которого был специализирован данный фацет. Фацет codecvt обеспечивает смену кодировок символов и используется в основном шаблоном basicfilebuf для преобразования между внутренними и внешними представлениями.

24. Константы. Целые константы. Константы с плавающей точкой. Символьные константы. Строки. NULL. Константы - объекты, не подлежащие использованию в левой части оператора присваивания, т.к. константа - является неадресуемой величиной и, хотя она хранится в памяти ЭВМ, нет никакого способа узнать ее адрес. В языке Си константами являются:- самоопределенные арифметические, символьные и строковые данные;- идентификаторы массивов и функций;- элементы перечислений. Арифметические константы могут быть целого или вещественного типов. Целочисленные константы Общий формат: ±n (+ обычно не ставится).Десятичные константы - последовательность цифр 0...9, первая из которых не должна быть 0. Константы вещественного типа

Данные константы размещаются в памяти по формату double, а во внешнем представлении могут иметь две формы:1) с фиксированной десятичной точкой, формат записи: ±n.m, где n, m - целая и дробная части числа;2) с плавающей десятичной точкой (экспоненциальная форма): ±n.mE±p, где n, m - целая и дробная части числа, р - порядок; ±0.xxxE±p - нормализованный вид, например, 1,25×10-8 = 0.125E-8. Символьная константа - это символ, заключенный в одинарные кавычки: 'A', 'х' (занимает 1 байт). Тип char® целое int. Строковая константа представляет собой последователь­ность символов кода ASCII, заключенная в кавычки (”) . Во внутреннем представлении к строковым константам добавляется нулевой символ '\0', еще называемый нуль-терминатор, отмечающий конец строкиNULL в языках программирования Си и C++ — макрос, объявленный в заголовочном файле stddef.h (и других заголовочных файлах). Значением этого макроса является зависящая от реализации константа нулевого указателя

25. Операции и выражения языка СиОперации языка Си предназначены для управления данными (более 40). Для их использования необходимо знать:- синтаксис;- приоритеты (15 уровней);- порядок выполнения. Выражения состоят из операндов, операций, скобок и используются для вычисления некоторого значения определенного типа. Каждый операнд может быть, в свою очередь, выражением или одним из его частных случаев.Операции, применяемые к одному операнду, - унарные, к двум операндам – бинарные, есть операция с тремя операндами - тернарная. Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Большинство операций выполняются слева направо, например, a+b+c® (a+b)+c. Исключение: унарные операции, операции присваивания и условная операция (?:) - справа налево.Формат операции присваивания: <ID> = <выражение>;В СИ предусмотрен набор операций для работы с отдельными битами слов. Эти операции нельзя применять к переменным вещественного типа (float, double). Перечень операций над битами и их обозначения:

~- дополнение (унарная операция); инвертирование (одноместная операция);

&- побитовое И - конъюнкция;

|- побитовое включающее ИЛИ - дизъюнкция;

^- побитовое исключающее ИЛИ - сложение по модулю 2;>> - сдвиг вправо; <<- сдвиг влево.

26.Арифметические операции. Аддитивные и мультипликативные операции.Арифметические операции - бинарные. Перечень арифметических операций и их обозначений:

+ - сложение;

- - вычитание (либо унарная операция - изменение знака); / - деление (для int операндов - с отбрасыванием остатка); * - умножение; % -остаток от деления целочисленных операндов со знаком первого операнда (деление по модулю).Операндами традиционных арифметических операций (+ - * /) могут быть константы, переменные, идентификаторы функций, элементы массивов, указатели, любые арифметические выражения. Порядок выполнения операций:

- выражения в круглых скобках;

- функции (стандартные математические, функции пользователя);

- * / выполняются слева направо;

- + ─ слева направо.

Порядок выполнения операций можно определять круглыми скобками, тогда выражение в скобках выполняется в первую очередь (слева направо).Унарные операции + и – обладают самым высоким приоритетом, определены только для целых и вещественных операндов, «+» носит только информационный характер, «–» меняет знак значения операнда на противоположный (не адресная операция).Аддитивные операции + и - группируются слева направо. Выполняютсяобычные арифметические преобразования. Для каждой операции имеютсянекоторые дополнительные возможности, связанные с типами операндов.Мультипликативные операции *, /, и % группируются слева направо.Выполняются обычные арифметические преобразования.

27. Условный оператор if. Условный оператор реализует выполнение определённых команд при условии, что некоторое логическое выражение (условие) принимает значение «истина» true. В большинстве языков программирования условный оператор начинается с ключевого слова if.

Встречаются следующие формы условного оператора:

Условный оператор с одной ветвью

if условие then команды end

При выполнении такого оператора вычисляется условие, и если оно истинно, то выполняются команды до ключевого слова end, в противном случае выполнение программы продолжается со следующей за условным оператором команды. В языках низкого уровня (ассемблерах) это — единственная доступная форма условного оператора. В некоторых языках для условного оператора с одной ветвью используется специальное ключевое слово (обычно это when).

Условный оператор с двумя ветвями

if условие then команды1else команды2 end

Здесь при истинности условия выполняются команды1 при ложности — команды2. При необходимости проверить последовательно несколько условий возможно каскадирование условных операторов:

if условие1

then команды1

elseif условие2then команды2

else if условие3 then команды3

...

else if условиеN-1 then командыN-1

elseкомандыNend;

28. Тернарная условная операция ?:.Терна́рнаяусло́внаяопера́ция (от лат. ternarius — «тройной») (обычно записывается как ?:) — во многих языках программирования операция, возвращающая свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом. Как можно судить из названия, тернарная операция принимает всего три указанных операнда.Безотносительно определённого языка программирования, тернарную операцию можно определить так: логическое выражение ? выражение 1 : выражение 2

Алгоритм работы операции следующий:

Вычисляется логическое выражение.

Если логическое выражение истинно, то вычисляется значение выражения выражение 1, в противном случае — значение выражения выражение 2.

Вычисленное значение возвращается.

Нужно обратить внимание, что вычисляется только одно из выражений: выражение 1 или выражение 2

Ввод-вывод потоками

Потоки ввода/вывода используются для передачи данных в файловые потоки,

на консоль или на сетевые соединения. Потоки представляют собой объекты со-

ответствующих классов. Библиотека ввода/вывода предоставляет пользователю

большое число классов и методов и постоянно обновляется.Оболочка оперирует с вводимой и выводимой информацией посредством файлов специального вида - ``потоков (streams)''. Стандартный вывод - это файл, в который оболочка выводит результаты работы команд - по умолчанию, на экран Вашего терминала. Стандартный ввод (обычно это клавиатура) является источником данных для команд. Если команда считывает данные из стандартного ввода, она делает это до тех пор, пока Вы не введете Ctrl-d в новой строке. Если команда завершает выполнение с ошибкой, на экран обычно выводится сообщение об ошибке. Это сообщение принадлежит отдельному стандартному потоку для ошибок.

42. Препроцессор. Директивы #include, #define, #if...

Директивой препроцессора (или командной строкой препроцессора[1]) называется строка в исходном коде, которая начинается с символа # и следующего за ним ключевого слова препроцессора. Есть чётко определённый список ключевых слов:define — задаёт макроопределение (макрос) или символическую константу undef — отменяет предыдущее определение include — вставляет текст из указанного файла if — осуществляет условную компиляцию при истинности константного выражения Препроцессор Си, встречая следующие директивы:

#include "..."

или

#include<...>

полностью копирует содержимое указанного файла в файл, в котором указана эта директива, в месте вызова директивы. Эти файлы обычно (хотя скорее, всегда) содержат определение интерфейса для различных функций библиотек и типов данных, которые должны быть подключены перед их использованием; таким образом, директива #include обычно указывается в начале (заголовке) файла. По этой причине подключаемые файлы и называются заголовочными. Некоторые содержат примеры из стандартной библиотеки Си (<math.h> и <stdio.h>), обеспечивая математические функции и функции ввода-вывода соответственно

43. Одномерные массивы. Инициализация одномерных массивов. Ввод и инициализация массива символов.Индексы у одномерных массивов в языке Си начинаются с 0, а в программе одномерный массив объявляется следующим образом:<тип><ID_массива>[размер]={список начальных значений};где:тип – базовый тип элементов (целый, вещественный, символьный); размер – количество элементов массива.Список начальных значений используется при необходимости инициализировать данные при объявлении, он может отсутствовать.Размер массива может задаваться константой или константным выражением. Нельзя задавать массив переменного размера. Для этого существует отдельный механизм – динамическое выделение памяти. Пример объявления массива целого типа: int a[5];В массиве «а» первый элемент: а[0], второй – а[1], … пятый - а[4].

44.Многомерные массивы. Инициализация многомерных массивов.Как уже отмечалось, в языке Си кроме одномерных массивов возможна работа с многомерными массивами. Объявление многомерного массива: <тип><ID>[размер1][размер2]…[размерN]={{список начальных значений}, {список начальных значений},…}; Наиболее быстро изменяется последний индекс элементов массива, поскольку многомерные массивы в языке Си размещаются в памяти компьютера в последовательности столбцов.Например, элементы двухмерного массива b[3][2] размещаются в памяти компьютера в следующем порядке:b[0][0], b[0][1], b[1][0], b[1][1], b[2][0], b[2][1].

Следующий пример иллюстрирует определение массива целого типа, состоящего из трех строк и четырех столбцов, с одновременным присвоением его элементам (инициализацией) начальных значений:int a[3][4] = {{1,2,0,0},{9,-2,4,1},{-7,0,0,0}};

Если в какой-то группе { } список значений короче, то оставшимся элементам присваивается 0.

. . .

for(i=0;i<N;i++)

Vvod(i, &Stud[i]);

puts("\n Spisok Students");

for(i=0;i<N;i++)

Out(i+1, Stud[i]);

. . .

}

// Функция вывода на экран данных одного элемента структуры

void Out(int nom, Spisokdan) {

printf("\n %3d – %20s %4.2lf ",nom, dan.Fio, dan.S_Bal);

}

// Функция ввода данных одного элемента структуры

void In (int nom, Spisok *sved) {

printf("\n Введите сведения %d : ", nom+1);

fflush(stdin);

puts("\n ФИО – ");

gets(sved–>Fio);

puts("\n Среднийбалл – ");

scanf(“%lf”, &sved–>S_Bal);

}

Битовые поля – это особый вид полей структуры. Они используются для плотной упаковки данных, например, флажков типа «да/нет». Минимальная адресуемая ячейка памяти – 1 байт, а для хранения флажка достаточно одного бита. При описании битового поля после имени через двоеточие указывается длина поля в битах (целая положительная константа), не превышающая разрядности поля типа int.

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

unionID_объединения {

Описание полей

};

Пример описания объединенного типа:

unionword {

intnom;

charstr[20];

};

Пример объявления объектов объединенного типа:

union word *p_w, mas_w[100];

Объединения применяют для экономии памяти в случае, когда объединяемые элементы логически существуют в разные моменты времени либо требуется разнотипная интерпретация поля данных.Практически все вышесказанное для структур имеет место и для объединений. Декларация данных типа union, создание переменных этого типа и обращение к полям объединений производится аналогично структурам.Перечисления – средство создания типа данных посредством задания ограниченного множества значений.Определение перечисляемого типа данных имеет вид

enumID_перечисляемого_типа {

список_значений };

Значения данных перечисляемого типа указываются идентификаторами, например:

enum marks {

zero, one, two, three, four, five };

Компилятор последовательно присваивает идентификаторам списка значений целочисленные величины 0, 1, 2,... . При необходимости можно явно задать значение идентификатора, тогда очередные элементы списка будут получать последующие возрастающие значения. Основные операции с данными перечисляемого типа:– присваивание переменных и констант одного типа;– сравнение для выявления равенства либо неравенства.Практическое назначение перечисления – определение множества различающихся символических констант целого типа.

48. Указатели. Указатели и адреса объектов. Указатели и массивы.При обработке декларации любой переменной, например doublex=1.5; компилятор выделяет для переменной участок памяти, размер которого определяется ее типом (double – 8 байт), и инициализирует его указанным значением (если таковое имеется). Далее все обращения в программе к переменной по име­ни заменяются компилятором на адрес участка памяти, в котором будет храниться значение этой переменной. Разработчик программы на языке Си имеет возможность определить собственные переменные для хранения адресов участков оперативной памяти. Такие переменные называются указателями.Итак, указатель – это переменная, которая может содержать адрес некоторого объекта. Простейшая декларация указателя имеет формат

тип * ID_указателя;

Например: int *a; double *f; char *w;

Здесь тип может быть любым, кроме ссылки или битового поля.Символ«звездочка»относится непосредственно к ID указателя, поэтому для того, чтобы декларировать несколько указателей, ее нужно записывать перед именем каждого из них. Например, в декларации:

int *a, *b, с;

определены два указателя на участки памяти для целочисленных данных, а также обычная целочисленная переменная с.Значение указателя равно первому байту участка памяти, на который он ссылается.Указатели предназначены для хранения адресов областей памяти. В языке Cи имеются тривида указателей – указатели на объект известного типа, указатель типа void и указатель на функцию. Эти три вида различаются как своими свойствами, так и набором допустимых операций. Указатель не является самостоятельным типом данных, так как всегда связан с каким-либо конкретным типом, т.е. указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа.Указатель типа voidприменяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов).Указателю типа void можно присвоить значение указателя любого типа, а также сравнивать его с любыми другими указателями, но перед выполнением каких-либо действий с участком памяти, на которую он ссылается, требуется явно преобразовать его к конкретному типу.Указатель может быть константой или переменной, а также указывать на константу или переменную.С указателями-переменными связаны две унарные операции& и *.Операция & означает «взять адрес» операнда. Операция * имеет смысл – «значение, расположенное по указанному адресу» (операция разадресации).Таким образом, обращение к объектам любого типа как операндам операций в языке Cи может производиться:– по имени (идентификатору);– по указателю (операция косвенной адресации)

50. Операции с указателями: сложение и вычитание, инкремент и декремент, сравнение указателейПомимо уже рассмотренных операций, с указателями можно выполнять арифметические операции сложения, инкремента (++), вычитания, декремента (--) и операции сравнения.Арифметические операции с указателями автоматически учитывают размер типа величин, адре­суемых указателями. Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например с массивами.Инкремент перемещает указатель к следующему элементу массива, декремент – к предыдущему. Указатель, таким образом, может использоваться в выражениях вида

p # iv, ## p, p##, p# = iv,

p – указатель, iv – целочисленное выражение, # – символ операции '+' или '–'.Результатом таких выражений является увеличенное или уменьшенное значение указателя на величину iv* sizeof(*p), т.е. если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умножен­ную на размер объекта данного типа.Текущее значение указателя всегда ссылается на позицию некоторого объекта в памяти с учетом правил выравнивания для соответствующего типа данных. Таким образом, значение p # iv указывает на объект того же типа, расположенный в памяти со смещением на iv позиций. При сравнении указателей могут использоваться отношения любого вида («>», «<» и т.д.), но наиболее важными видами проверок являются отношения равенства и неравенства («==», «!=»).Отношения порядка имеют смысл только для указателей на последовательно размещенные объекты (элементы одного массива).Разность двух указателей дает число объектов адресуемого ими типа в соответствующем диапазоне адресов, т.е. в применении к массивам разность указателей, например, на третий и шестой элементы равна 3. Очевидно, что уменьшаемый и вычитаемый указатели должны принадлежать одному массиву, иначе результат операции не имеет практической ценности и может привести к непредсказуемому результату. То же можно сказать и о суммировании указателей.Значение указателя можно вывести на экран с помощью функции printf, используя спецификацию %p (pointer), результат выводится в шестнадцатеричном виде.

51. Работа с динамической памятью.Динамические массивы.В языке Си размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами переменной размерности вместо массива достаточно объявить указатель требуемого типа и присвоить ему адрес свободной области памяти (захватить память). После обработки массива занятую память надо освободить. Библиотечные функции работы с памятью описаны в файле alloc.h. Пример создания динамического массива:

float*x;

intn;

printf("\nРазмерность - "); scanf(" %d",&n);

if((x = calloc(n, sizeof(*x)))==NULL) { // Захватпамяти

printf("\n Предел размерности “);

exit(1); }

else{

printf("\n Массив создан !");

...

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

printf("\n%f",x[i]);

...

free(x); // Освобождение памяти

}

ВС++ введены две операции: захват памяти - newи освобождение захваченной ранее памяти - delete.Общий формат записи: указатель = newтип (значение);Пример создания одномерного динамического массиваМассив объявляем указателем.

...

double*x;

inti, n;

...

puts(" Введите размер массива: ");

scanf(“%d”, &n);

x = new double [n] ;

if(x == NULL) {

puts(" Предел размерности ! ");

return; }

for(i=0; i<n; i++) // Ввод элементов массива

scanf(“%lf”, &x[i]);

...

delete[ ]x; // Освобождение памяти

Операции typedef и sizeof.

Операция typedef. Любому типу данных, как стандартному, так и определенному пользователем, можно задать новое имя с помощью операции typedef<тип><новое_имя>;Введенный таким образом новый тип используется аналогично стандартным типам, например, введя пользовательские типы:typedefunsignedintUINT;typedefcharM_s[100];декларации идентификаторов введенных типов имеют видUINT i, j;→ две переменные типа unsignedint;M_sstr[10]; → массив из 10 строк по 100 символов. Операция sizeofДанная операция позволяет определить размер объекта по его идентификатору или типу, результатом является размер памяти в байтах (типрезультата int). Формат записи:sizeof(параметр);где параметр – тип или ID объекта (не ID функции).Если указан идентификатор сложного объекта (массив, структура, объединение), то получаем размер всего сложного объекта. Например:sizeof(int)→ размер памяти 2 байта,

intb[5];

sizeof(b)→ размер памяти 10 байт.

Наиболее часто операция sizeofприменяется при динамическом распределении памяти.

53.Функции.Определение функции. объявление функции и вызов функции. Возвращаемое значение функции.В языке Си любая подпрограмма – функция, представляющая собой отдельный программный модуль, к которому можно обратиться в любой момент и (в случае необходимости) передавать через параметры некоторые исходные данные и который (в случае необходимости) способен возвращать один или несколько результатов своей работы. Объявление функции пользователя, т.е. ее декларация, выполняется в двух формах – в форме описания и форме определения. Полное определение функции имеет следующий вид:

тип_результатаID_функции(список параметров) {

код функции returnвыражение;

}. Вызов функции имеет следующий формат:

ID_функции (список аргументов);где в качестве аргументов можно использовать константы, переменные, выражения (их значения перед вызовом функции будут определены компилятором).

54.Функции. Типы передачи параметров функции (по значению, по адресу).В языке Си аргументы при стандартном вызове функции передаются по значению. Это означает, что в стеке, как и в случае локальных данных, выделяется место для формальных параметров функции. В выделенное место при вызове функции заносятся значения фактических аргументов, при этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение. Затем функция использует и может изменять эти значения в стеке. При выходе из функции измененные значения теряются, т.к. время жизни и зона видимости локальных параметров определяется кодом функции. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции. В случае необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента необходимо в вызываемую функцию передавать не значение переменной, а ее адрес.При передаче по адресу в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов. Для обращения к значению аргумента-оригинала используется операция «*».

Наши рекомендации