Передача параметра по ссылке

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

Передача по ссылке дает возможность избежать копирования всей инфы, описывающей состояние объекта (а это может быть значительно больше чем sizeof(int)) и является нужной для конструктора копирования.

Если функция возвращает значение по ссылке (к примеру в виде "return *this;"), то её вызов можно использовать слева от оператора присваивания Передача параметра по ссылке (смотри также L-выражение).

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

Таким макаром можно ждать, что примерная программка напечатает (если закоментировать неверную строчку) "0010 022 233 333".

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

57. Рекурсия в языке Си.

В языке Си функции могут вызывать сами себя, т.е. владеть свойством рекурсивности. Рекурсивная функция непременно должна содержать внутри себя условие окончания рекурсивности, чтоб не вызвать зацикливания программки Передача параметра по ссылке. При каждом рекурсивном вызове создается новое мно­жество локальных переменных. Т.о. переменные, расположенные вне вызываемой функции, не меняются.

Пример. Составить рекурсивную функцию, вычисляющую факториал числа n последующим образом: n!= 1 , если n 1

long fact( int n)

{ if (n <=1) return l;

else return (n * fact ( n -1 )); // функция fact вызывает саму себя

}

Таким макаром Передача параметра по ссылке, поочередно вызываются функции f(n), f(n-1),f(n-2)…f(1).

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

58. Указатель на функцию в языке Си.

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

void error(char* p) { /* ... */ }

void (*efct)(char*); // указатель на функцию

void f()
{
efct = &error; // efct настроен на функцию error
(*efct)("error"); // вызов error через указатель efct
}

Для вызова функции при помощи указателя (efct в нашем примере) нужно сначала применить Передача параметра по ссылке операцию косвенности к указателю - *efct. Так как ценность операции вызова () выше, чем ценность косвенности *, нельзя писать просто *efct("error"). Это будет означать *(efct("error")), что является ошибкой. По той же причине скобки необходимы и при описании указателя на функцию. Но, писать просто efct("error") можно, т.к. транслятор соображает, что efct Передача параметра по ссылке является указателем на функцию, и делает команды, делающие вызов подходящей функции.

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

59. Классы хранения переменных языка Си.

В языке C все Передача параметра по ссылке переменные и функции должны быть объявлены до их использования. Объявление переменной устанавливает соответствие имени и атрибутов переменной, вызывает выделение памяти для хранения ее значения. Место размещения переменной в памяти программки задается при помощи класса памяти (класса хранения) переменной. Зависимо от места размещения переменной в памяти определяется время жизни и Передача параметра по ссылке область видимости переменной. Класс памяти задается спецификатором класса памяти.

В языке C имеется 4 класса памяти:

- extern (наружные переменные);

- auto (автоматические переменные);

- register (регистровые переменные);

- static (статические переменные);

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

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

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

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

Служебное слово, определяющее класс памяти, ставится в описаниях переменных перед служебным словом, задающим тип переменных:

static int i,j Передача параметра по ссылке;

extern char ch1;

register int k;

60. Консольный ввод/вывод данных в языке Си.

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

Как ранее говорилось, главные функции ввода/вывода задаются в заголовочном файле stdio.h. Познакомимся с 2-мя полезными функциями, объявленными в этом файле и выполняющими последующие деяния:

printf() – консольный вывод

scanf() – консольный ввод.

Структура (синтаксис) воззвания к функции:

printf ("строчка формата", арг1, арг2, …, аргN);

В качестве аргументов функции Передача параметра по ссылке арг1…аргN употребляются идентификаторы переменных либо выражения. Перечень аргументов может быть пустым.

Строчка формата записывается в двойных кавычках и может содержать:

Напомним, что управляющий знак, либо ESC-последовательность Передача параметра по ссылке, формируется из знака оборотной наклонной черты\, именуемого в языке C escape-символом, и латинской буковкы.

Структура (синтаксис) воззвания к функции:

scanf("строчка формата", перечень аргументов);

При помощи данной функции делается ввод с клавиатуры значений переменных, перечисленных в перечне аргументов в формате, определенном строчкой формата. Функция конвертирует последовательность Передача параметра по ссылке вводимых знаков в разные формы: целые числа, числа с плавающей точкой, знаки и строчки C.

Особенности функции:

Задачей аргумента в данной функции является указание адреса ячейки памяти, куда должно быть помещено вводимое значение. Так, знак& обозначает операцию получения адреса переменной, т. е. конструкция &p обеспечивает Передача параметра по ссылке ввод значения в ячейку памяти, где расположена переменная p.

При использовании функции scanf() нужно держать в голове два правила:

61. Файловый ввод/вывод данных Передача параметра по ссылке в языке Си.


pereezd-vtveriyu-razmeshenie-v-gostinice.html
pereformulirovat-istoriyu.html
peregonov-i-razdelnih-punktov.html