Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Массивы; их описание, размещение в памяти, инициализация.




Размещение элементов массива в памяти выполняется последовательно.

Количество элементов в массиве определяет размер массива и является константным выражением.

Имя массива определяет адрес первого элемента массива.

Имя массива в отличие от имени вектора нельзя указывать в левой части оператора присваивания.

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

Например, для массива charaCh[2][4] будет выделено восемь байтов памяти, в которых в следующем порядке будут размещены элементы массива:

ЭлементaCh[0][0] aCh[0][1] aCh[0][2] aCh[0][3] aCh[1][0] aCh[1][1] aCh[1][2] aCh[1][3]

N байта             1                2                 3                   4     5                  6    7                  8

Двухмерные массивы можно рассматривать как матрицу, в которой первый индекс определяет строку, а второй индекс - столбец. Порядок расположения элементов матрицы в памяти - по строкам.

При размещении трехмерного массива charaCh[3][2][5] память под элементы этого массива будет выделяться последовательно в соответствии со следующими значениями индексов:

Общий объем выделяемой под массив памяти определяется как произведение всех размерностей массива (общее число элементов), умноженное на длину типа данных массива.

Строки; их описание, инициализация.

Символьные строки организуются как массивы символов, последним из которых является символ \0, внутренний код которого равен нулю.

 

На длину символьного массива в Си нет ограничения.

Форма записи:

charstring[10];

где: string – имя строковой переменной              

10 – размер массива, то есть в данной строке может поместиться 9 символов, последнее место отводится под нуль-терминатор

Строка при объявлении может быть инициализирована начальным значением, например, так:

charstring[10] = "abcdefghf\0";

Функции для определения длины строки, сравнения и копирования строк.

Сравнение строк:

intstrcmp(char *s1, char *s2) (сравнивает s1 и s2, возвращает значение 0, если строки эквивалентны)

intstrncmp(char *s1, char *s2, intn) (сравнивает не более n символов строк s1 и s2, возвращает значение 0, если начальные n символов строк эквивалентны)

Определение длины строки:

intstrlen(char *s) (возвращает количество символов в строке s)

Копирование строк:

char *strсpy(char *s1, char *s2) (копирует строку s2 в строку s1, включая '\0', возвращает s1)

char *strncpy(char *s1, char *s2, intn) (копирует не более n символов строки s2 в строку s1, возвращает s1;)

Структуры. Шаблон структуры, имя структуры, указатель на структуру, доступ к элементам структуры.

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

Форма записи:

struct [имя типа]

  {

   поле_1;

   поле_2;

   ...

   поле_N;

  } [список переменных];

Заказ памяти для одномерного массива.

Формазаписи:

с=(int*)malloc(n*sizeof(int));

где: int – тип

   с - массив

malloc – размер массива в байтах

sizeof – размер одного элемента массива в байтах

n – количество элементов в массиве

Заказ памяти для матрицы.

Форма записи:

с=(int*)malloc(n*sizeof(int));

x=(int*)malloc(m*sizeof(int));

a=(int*)malloc(m*sizeof(int));

где: int – тип

c – массив строки

x – массив столбца

a – матрица

malloc – размер массива (строка или столбец) в байтах

sizeof – размер одного элемента массива (строки и столбца) в байтах

n – количество элементов в строке

m – количество элементов в столбце

Заказ памяти для массива структур.

tel=(TEL *)malloc(sizeof(TEL)*n);

где: TEL – тип

tel – массив строки

malloc – размер структуры в байтах

sizeof – размер одного элемента структуры в байтах

n – количество элементов в структуре

Функции; формальные и фактические аргументы. Имя функции как аргумент другой функции.

Функция задаётся следующим образом:

тип_функцииимя_функции (формальные аргументы)

{

                   текст

}

имя_функции – это идентификатор;

формальные_аргументы – это список имен аргументов,

которые будут переданы функции.

Функция не может быть описана внутри других функций.

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

1. имя_переменной = имя_функции(фактические аргументы);

2. имя_функции(фактические аргументы);

                   Фактические_аргументы должны соответствовать формальным по количеству, типу и порядку следования.

Классы памяти; область действия имен переменных. Блоки.

Класс памяти auto

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

intnVar = 5;

Такая переменная видна внутри блока.

Переменные с классом памяти auto размещаются в стеке.

Итак по умолчанию локальная переменная имеет класс памяти auto.

Класс памяти static

Переменные, объявленные как static, т.е. статические, сохраняют своё значение между вызовами.

Ещё одна тонкость. static переменная инициализируется только один раз. Если бы это было иначе, то значение статической staticVar обнулилось бы при повторном вызове.

По умолчанию все глобальные переменные являются статическими. И видны они только в своём файле.

Класс памяти extern

Класс памяти extern в C используем в двух случаях:

если переменная объявляется в программе ниже, чем ссылка на неё;

если переменная объявлена в другом модуле.

Класс памяти register в

Применение модификатора register есть рекомендация компилятору хранить данную переменную в регистре, а не в оперативной памяти. Не факт, что так и будет. Если программа часто обращается к переменной, то есть смысл объявить её с модификатором register.

Применять register можно только к near указателям и целому типу. Использовать register можно и при указании формальных параметров функций.

 

Преобразования данных при помощи функций sprintf и sscanf.

Библиотека языков C, C++ включает две функции sprintf и sscanf, с помощью которых реализуются прямые и обратные форматные преобразования данных в оперативной памяти. Техника их использования ничем не отличается от функций printf/fprintf и scanf/fscanf. Разница только в том, что первым аргументом новых функций является указатель на строку – массив типа char, расположенный в оперативной памяти. Для функции sscanf эта строка является источником данных, а для функции sprintf в эту строку помещаются результаты преобразования данных из машинного представления.

Форма записи:

sscanf(str,"список_форматов", список_ввода);

sprintf(str,"список_форматов \n",список_вывода);

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

Аргументы функции main.

Имеется два встроенных аргумента функции main: argc и argv.                                                      Форма записи:

intmain(intargc, char *argv[]) {...}

Аргумент argc типа integer содержит в себе количество аргументов командной строки.

Аргумент argv типа char - указатель на массив строк. Каждый элемент массива указывает на аргументы командной строки. Один параметр отделяется от другого пробелами.

argv[0] - полное имя запущенной программы

argv[1] - первая строка записаная после имени программы

argv[2] - вторая строка записаная после имени программы

argv[argc-1] - последняя строка записаная после имени программы

argv[argc] - NULL










Последнее изменение этой страницы: 2018-04-12; просмотров: 314.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...