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

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

// Передача указателя функции -- исправленная версия.

#include

using namespace std;

void f (int *j);

int main()

{

 int i;

 f(&i);

 cout << i;

 return 0;

}

void f (int * j)

{

 *j = 100; // Переменной, адресуемой указателем j, присваивается число 100.

}

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

Вызов функций с массивами

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

#include

using namespace std;

void display(int num[10]);

int main()

{

 int t[10], i;

 for(i=0; i<10; ++i) t[i]=i;

 display(t); // Передаем функции массив t.

 return 0;

}

// Функция выводит все элементы массива.

void display(int num[10])

{

 int i;

 for(i=0; i<10; i++) cout << num[i] <<' ';

}

Несмотря на то что параметр num объявлен здесь как целочисленный массив, состоящий из 10 элементов, С++-компилятор автоматически преобразует его в указатель на целочисленное значение. Необходимость этого преобразования объясняется тем, что никакой параметр в действительности не может принять массив целиком. А так как будет передан один лишь указатель на массив, то функция должна иметь параметр, способный принять этот указатель.

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

void display(int num[])

{

 int i;

 for(i=0; i<10; i++) cout << num[i] << ' ';

}

Здесь параметр num объявляется как целочисленный массив неизвестного размера. Поскольку C++ не обеспечивает проверку нарушения границ массива, то реальный размер массива — нерелевантный фактор для подобного параметра (но, безусловно, не для программы в целом). Целочисленный массив при таком способе объявления также автоматически преобразуется С++-компилятором в указатель на целочисленное значение.

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

void display(int *num)

{

 int i;

 for(i=0; i<10; i++) cout << num[i] << ' ';

}

Возможность такого объявления параметра (в данном случае num) объясняется тем, что любой указатель (подобно массиву) можно индексировать с помощью символов квадратных скобок ([]). Таким образом, все три способа объявления параметра-массива приводятся к одинаковому результату, который можно выразить одним словом: указатель.

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

#include

using namespace std;

void display(int num);

int main()

{

 int t[10],i;

 for(i=0; i<10; ++i) t[i]=i;

 for(i=0; i<10; i++) display(t[i]);

 return 0;

}

// Функция выводит одно число.

void display(int num)

{

 cout << num << ' ';

}

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги