Читайте также:
|
|
Лекция 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Реализация функции асинхронного RS– триггера | | | Данная функция может печатать содержимое двухмерных массивов с любой первой размерностью. |