Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
31
Добавлен:
17.04.2013
Размер:
152.06 Кб
Скачать

Понятие ссылки

В С++ имеется несколько видоизмененная форма указателя, называемая ссылкой. Ссылка на некоторую переменную может рассматриваться как указатель, который при употреблении всегда разыменовывается. Однако для ссылки не требуется дополнительного пространства памяти: она является просто другим именем (псевдонимом) переменной.

Для определения ссылки применяется унарный оператор &.

Пример 10[2].

# include <stdio.h>;

int value=10;

int &refval=value; // Ссылка на value

int main (void)

{ printf ("value=%d\n", value);

refval+=5; // Модификация через ссылку

printf ("value=%d\n", value);

printf ("Адрес value равен %р\n",&value);

printf ("Адрес refval равен %p\n", &refval);

return 0;

}

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

Пример 11[2].

# includе <stdio.h>

void Inc_val (int i) // Получает параметр-значение

{ i++; // Модификация не влияет на оригинал

}

void Inc_ptr (int *i) // Получает адрес оригинала

{(*i)++; // Модифицирует оригинал путем косвенной адресации

}

void Inc_ref (int & i) // Получает параметр-ссылку

{i++; // Модифицирует оригинал!

}

int main(void)

{ int j=10;

printf ("j=%d \n", j);

Inc_val (j);

printf ("После Inc_val (j) j = %d \n", j);

Inc_ptr (&j);

printf ("После Inc_ptr (j) j=%d \n", j);

Inc_ref (j);

printf ("После Inc_ref (j) j=%d \n", j);

return 0;

}

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

  1. вызывающей функции не требуется применять операцию взятия адреса (&);

  2. вызываемая функция избавляет от использования косвенных операций (*).

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

Пример 12 [2].Ссылка как возвращаемый функцией тип.

#include <stdio.h>

const int arraySize = 0xF;

static int valArray[arraySize];

int &valueAt(int indx)

{ return valArray [indx];

}

int main (void)

{ for (int i=0; i<arraySize; i++)

valueAt (i)=1<<i;

for (i=0; i<arraySize; i++)

printf ("Значение [%2d]= %-6d \n", i, valueAt(i));

return 0;

}

Функцию valueAt(int) можно применять как для чтения элемента с определенным индексом, так и для присваивания нового значения этому элементу.

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

Пример 13.

#include <stdio.h>

const int row=3; // количество строк

const int col=4; // количество столбцов

int min(int array[][col], int r, int c);

void printArr(int array[][col], int r, int c);

Можно эти прототипы переписать в виде

int min(int [][col], int, int);

void printArr(int [][col], int, int);

main()

{ int m;

int MyArr[row][col]={{2,5,7,4},

{3,2,0,9},

{3,7,8,1}};

printArr(MyArr, row, col);

m=min(MyArr, row, col);

printf("%3d\n",m);

return 0;

}

int min(int array[][col], int r, int c)

{ int minimum=array[0][0];

for (int i=0; i<r; i++)

for (int j=0; j<c; j++)

if (minimum<array[i][j])

minimum=array[i][j];

return minimum;

}

void printArr(int array[][col], int r, int c)

{ int minimum=array[0][0];

for (int i=0; i<r; i++)

{for (int j=0; j<c; j++)

printf("%3d",array[i][j]);

printf("\n");

}

}

Соседние файлы в папке Lab2