Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Использование const при описании функции.

Читайте также:
  1. Const var
  2. Const var
  3. Construction and Maintenance of Infrastructure
  4. DISCUSSING CONSTRUCTION PERIOD
  5. Translate the sentences from English into Russian paying attention to the Passive Voice construction.
  6. А) ИСПОЛЬЗОВАНИЕ КАТЕГОРИИ ВИДА В РУССКОМ ЯЗЫКЕ
  7. Автоматическая идентификация. Использование технологии штрихового кодирования при выполнении транспортных операций.

Лекция N 4

Параметр функции - указатель

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

void swap(int * arg1, int * arg2)

{

int tmp=*arg1;

*arg1=*arg2;

*arg2=tmp;

}

Void main(void)

{

int x=1,y=2;

swap(&x,&y); // в качестве фактических параметров используются

// адреса переменных x и y

// . . .

}

При каждом вызове функции в стеке создается новая копия ее формальных параметров и автоматических (локальных) переменных. Занятая ими память после

Выхода из функции освобождается, поэтому некорректно возвращать указатель на

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

затем может измениться непредсказуемым образом:

int* f()

{

int local = 1;

// ...

return &local; // ошибка

}

Ссылки, использование ссылок в качестве параметров

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

int x, i=1;

int &r=i; // теперь r ссылается на i

x=r; // x=1

r=2; // i=2

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

int i=0;

int &r=i;

r++; // i увеличивается на единицу, поскольку r “ссылается” на i

Ниже приведен пример предыдущей функции с использованием ссылок в качестве параметров.

void swap(int & arg1, int & arg2)

{

int tmp=arg1;

arg1=arg2;

arg2=tmp;

}

Void main(void)

{

int x=1,y=2;

swap(x,y); // в качестве фактических параметров используются

// . . . ссылки на переменные x и y

}

Таким образом параметры в функцию незаметно для нас передаются через их адреса.

Ссылкой может быть возвращаемое значение функции. Например:

int &move(int&i)

{

Return i;

}

Void main(void)

{

int i=10;

move(i)=100;

printf("%d\n",i); // печатается 100

}

Некорректно возвращать ссылку на локальную переменную, так как она

перестает существовать при выходе из функции, например:

int& f()

{

int local = 1;

// ...

return local; // ошибка

}

К счастью, транслятор предупреждает о том, что возвращается ссылка на

локальную переменную. Вот другой пример:

int& f() { return 1; } // ошибка

Использование const при описании функции.

void f(const large& arg)

{

// подчеркивается, что значение "arg" внутри функции не меняется

}

Если в описании параметра ссылки const не указано, то это рассматривается как намерение изменять передаваемый объект:

void g(large& arg); // считается, что в g() arg будет меняться

Точно так же, описание параметра, являющегося указателем, со спецификацией const говорит о том, что указываемый объект не будет изменяться в вызываемой функции. Например:

// из <string.h>

extern int strlen(const char*);

extern char* strcpy(char* to, const char* from);



extern int strcmp(const char*, const char*);


Дата добавления: 2015-07-07; просмотров: 148 | Нарушение авторских прав


Читайте в этой же книге: Параметры функции по умолчанию | Указатель на функцию | Функция main, с которой начинается выполнение Си-прораммы, может быть |
<== предыдущая страница | следующая страница ==>
Реализация функции асинхронного RS– триггера| Данная функция может печатать содержимое двухмерных массивов с любой первой размерностью.

mybiblioteka.su - 2015-2021 год. (0.033 сек.)