Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мини шпоры по инфе.docx
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
350.24 Кб
Скачать

Вариант 3

printf(“x\ty\n”);

for(x=0; x<11; printf(“%d\t%d\n”, x, x*x), x++);

17) Оператор цикла while

Основная форма имеет следующий вид:

while(выражение_условие)

операторы_действия;

Где оператор может быть простым, составным или пустым оператором. Выражение_условие, как и во всех других операторах, является просто выражением. Цикл выполняется до тех пор, пока условие принимает значение истинно. Когда же условие примет значение ложно, программа передаст управление следующему оператору программы.

Так же как и в цикле for в цикле while сначала проверяется условие, а затем выполняется действие. Таким образом, для заведомо ложного выражения_условия тело цикла не выполнится ни разу. Это называется цикл с предусловием.

18) Понятие указателя. Объявление, инициализация, операции.

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

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

Переменная в программе – это объект, имеющий имя и значение. По имени можно обратиться к переменной и получить ее значение.

Чтобы получить адрес переменной в явном виде, в языке Си применяют унарную операцию &. Выражение &X позволяет получить адрес участка памяти, выделенного на машинном уровне для переменной Х.

Операция & применима только к объектам, имеющим имя и размещение в памяти. Ее нельзя применять к выражениям, константам, регистровым переменным или внешним объектам.

Целые переменные занимаю по 2 байта, вещественные с плавающей точкой – 4 байта, символьные – 1 байт.

Адреса имеют целочисленные беззнаковый значения и их можно обрабатывать как целые величины.

В определениях и описаниях указателей применяется разделитель *, который является в этом случае знаком унарной операции косвенной адресации. Иначе называемой операцией разыменования или обращения по адресу. Операндом операции разыменования всегда является указатель. Результат этой операции – тот объект, который адресует указатель операнд.

Операции над указателями

В языке Си допустимы следующие основные операции над указателями:

1. присваивание.

Пример:

int x, *p, *pp;

p = &x;

pp = NULL;

pp = p;

 

  1. получение значения того объекта, на который ссылается указатель:

Пример:

int x = 2, y, *p;

p = &x;

y = *p;

printf(“y = %d\t *p = %d\n”, y, *p);

 

  1. получение адреса самого указателя:

Пример:

int x, *p;

p = &x;

printf(“p = %p\t &p = %p\n”, p, &p);

 

  1. унарные операции изменения значения указателя:

Пример:

int x, *p;

p = &x;

p++; // при изменении указателя на 1, он «переходит к началу»

// следующего поля той длины, которая определяется типом.

 

  1. арифметические операции:

Пример:

int x, *p;

p = &x;

*p = *p+3;

 

  1. операции сравнения:

Пример:

int x = 2, *p;

p = &x;

if(p!=NULL)

*p = 10;

 

  1. логические операции:

Пример:

int x = 2, *p, *pp = NULL;

p = &x;

if(!pp && p) *pp = *p;

19) Динамическое выделение памяти

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

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

Функции выделения и освобождения памяти 

Функция

Прототип и краткое описание

malloc

void *malloc(unsigned s);

Возвращает указатель на начало области (блока) динамической памяти длиной в s байт. При неудачном завершении возвращает значение NULL.

calloc

void *calloc(unsigned n, unsigned m);

Возвращает указатель на начало области (блока) обнуленной динамической памяти, выделенной для размещения n элементов по m байт каждый. При неудачном завершении возвращает значение NULL.

realloc

void *realloc(void *bl, unsigned ns);

Изменяет размер блока ранее выделенной динамической памяти до размера ns байт, bl – адрес начала изменяемого блока. Если bl равен NULL(память не выделялась), то функция выполняется как malloc. При неудачном завершении возвращает значение NULL.

free

void *free(void *bl);

Освобождает ранее выделенный участок (блок) динамической памяти, адрес первого байта

20) Понятие массива. Объявление, инициализация, операции.

Массив – это набор данных, объединенных общим типом и именем и различающихся порядковым номером (индексом). Математическим понятием массива является матрица.

тип имя_массива [количество_элементов];