- •1.1. Понятие указателя
- •Int* ptrInt;
- •1.2. Синтаксис описания указателя
- •1.3. Адрес переменной и значение переменной по адресу
- •Int main()
- •1.4. Адресная арифметика
- •1.5. Обращение к элементам массива
- •1.6. Приведение типов при работе с указателями
- •1.7. Работа с динамическими переменными
- •2.2. Передача параметров по адресу
- •Void swap(int* a, int* b)
- •2.3. Передача больших объемов данных
- •2.4. Инициализация указателей
- •2.5. Применение ссылок при работе с функциями
- •Void swap(int& a, int& b)
- •Int main()
- •Int Carrage(int* cr);
Int main()
{
int x, d, t[10];
float z, arr[20];
int *pVi;
float *pVf;
…
}
Последний шаг – это дать функции те типы значений, которые она хочет получить.
функция Grow требует первый параметр типа int, второй -указатель на тип float.
Правильные варианты фактических параметров:
Grow(x, pVf);
Grow(10, &z);
Grow(t[0], arr);
Кроме этого функция возвращает результат типа int в своем имени. Вы можете его использовать, если хотите:
d = Grow(x, pVf);
cout<<Grow(10, &z);
x = x + Grow(t[0], arr);
Неправильные варианты вызовов:
Grow(pVf, x); // порядок параметров нарушен: 1й – параметр не int, 2й – не float*
Grow(10); // функция требует 2 параметра, а не один
Grow(t, arr); //имя массива – это указатель на тип int, нужно значение типа int
z = Grow(x, pVf); // возвращаемое значение типа int, но z – типа float
Прототип функции не всегда позволяет точно определить входные и выходные параметры. Если имя функции имеет тип, отличный от void, то можно точно сказать, что функция возвращает как минимум одно значение. Например:
Int Carrage(int* cr);
Однако в данном случае нельзя однозначно сказать, чем является формальный параметр cr – входным или выходным значением. Такой механизм может быть использован как для передачи массива, так и для передачи адреса простой переменной типа int. Поэтому для определения назначения формальных параметров необходимо либо изучить тело функции, либо воспользоваться справкой (если функция является стандартной).
2.7. Задача. Все функции с помощью различных механизмов (передача по значению, по ссылке, по адресу) получают на вход целочисленное значение и возводят его в квадрат. Укажите формат вызова этих функций:
при использовании целочисленной переменной (столбец 3)
при использовании указателя на целочисленную переменную (столбец 4)
Прототип функции |
Обращение к значению num внутри функции |
Вызов функции |
|
1 |
2 |
3 |
4 |
|
|
int val |
int* ptr |
void squareVal(int num) |
num |
squareVal( ) |
squareVal( ) |
void squarePointer(int *num) |
*num |
squarePointer( ) |
squarePointer( ) |
void squareReference(int &num) |
num |
squareReference( ) |
squareReference( ) |
void squarePointerReference(int* &num) |
*num |
- |
squarePointerReference( ) |
#include <iostream>
#include <stdlib.h>
using std::cout;
using std::endl;
void squareVal(int num)
{
num = num * num;
cout<<"\t\tInside squareVal(int num): num = "<<num<<endl;
}
void squarePointer(int *num)
{
*num = (*num) * (*num);
cout<<"\t\tInside squarePointer(int *num): *num = "<<*num<<endl;
}
void squareReference(int &num)
{
num = num * num;
cout<<"\t\tInside squareReference(int &num): num = "<<num<<endl;
}
void squarePointerReference(int* &num)
{
*num = (*num) * (*num);
cout<<"\t\tInside squareReference(int &num): *&num = "<<*num<<endl;
}
