![](/user_photo/2706_HbeT2.jpg)
- •Отличия между доступом по имени массива и по указателю
- •Int const *(cptr_a);
- •Int main()
- •Int* V[10]; // массив указателей
- •Int (*p)[10]; // указатель массива
- •Int I: // целая переменная
- •Int * pi: // указатель на целую переменную
- •Void* ptr;
- •Int main(){
- •Классы памяти и динамическое выделение памяти
- •Динамические объекты в с
- •Рекомендации по использованию указателей и динамического распределения памяти
- •Void main()
- •Int n; // Порядок матрицы
- •Vveditre poriadok matrizi: 5
- •Int *pmin, I; // Рабочий указатель, содержащий результат
- •Void main() {
Void main()
{
// Определяются размеры массива
Int n; // Порядок матрицы
cout << "\nVveditre poriadok matrizi: ";
cin >> n;
// Указатель для массива указателей
float **matr;
matr = new float *[n]; // Массив указателей float *
if (matr == 0)
{
cout << "He создан динамический массив!";
return; // Завершение программы
}
for (int i = 0; i < n; i++)
{
// Строка-массив значений типа float:
matr[i] = new float[n];
if (matr[i] == 0)
{
cout << "He создан динамический массив!";
return; // Завершение программы
}
for (int j = 0; j < n; j++) // Заполнение матрицы
// Формирование нулевых элементов:
if (i != j)
matr[i][j] = 0;
else
// Формирование единичной диагонали:
matr[i][j] = 1;
}
for (i = 0; i < n; i++) // Цикл перебора строк
{
cout << "\n Stroka " << (i + 1) << ":";
// Цикл печати элементов строки:
for (int j = 0; j < n; j++)
cout << "\t" << matr[i][j];
}
for (i = 0; i < n; i++)
delete matr[i];
delete[]matr;
getchar();
getchar();
}
/*
Vveditre poriadok matrizi: 5
Stroka 1: 1 0 0 0 0
Stroka 2: 0 1 0 0 0
Stroka 3: 0 0 1 0 0
Stroka 4: 0 0 0 1 0
Stroka 5: 0 0 0 0 1
*/
Указатели и функции
Ссылки и указатели как параметры функции
При вызове функции информация о переменной может передаваться функции в двух видах. Если мы используем форму обращения
function1(x);
происходит передача значения переменной x. Если же мы используем форму обращения
function2(&x);
происходит передача адреса переменной x. Первая форма обращения требует, чтобы определение функции включило в себя формальный аргумент того же типа, что и x:
function1(int num)
Вторая форма обращения требует, чтобы определение функции включало в себя формальный аргумент, являющийся указателем на объект соответствующего типа:
function2(int *ptr)
Наиболее употребительно в Си, а в других языках - единственно возможное использование ссылки как формального параметра функции. Это означает, что при вызове функции формальный параметр создается как переменная-ссылка, то есть отображается на соответствующий фактический параметр. Различия двух способов передачи:
- при передаче по значению формальный параметр является копией фактического и может быть изменен независимо от значения оригинала - фактического параметра. Это входной параметр;
- при передаче по ссылке формальный параметр отображается на фактический, и его изменение сопровождается изменением фактического параметра-прототипа. Такой параметр может быть как входным, так и выходным.
Формальный параметр-ссылка совпадает с формальным параметром-значением по форме (синтаксису использования), а с указателем - по содержанию (механизму реализации).
//
// Формальный параметр - значение
void inc(int vv){ vv++; }
// Передается значение - копия nn
void main(){ int nn=5; inc(nn); } // nn=5
//
// Формальный параметр - указатель
void inc(int *pv) { (*pv)++; }
// Передается указатель - адрес nn
void main(){ int nn=5; inc(&nn); } // nn=6
//
// Формальный параметр - ссылка void inc (int &vv) { vv++; }
// Передается указатель - синоним nn
void main(){ int nn=5; inc(nn); } // nn=6
Указатель - результат функции.
Функция в качестве результата может возвращать указатель. Формальная схема функции обязательно включает в себя:
-
определение типа результата в заголовке функции как указателя. Это обеспечивается добавлением пресловутой "*" перед именем функции - int *F(...;
-
оператор return возвращает объект (переменную или выражение), являющийся по своей природе (типу данных) указателем. Для этого можно использовать локальную переменную - указатель.
Содержательная сторона проблемы состоит в том, что функция либо выбирает один из известных ей объектов (переменных), либо создает их в процессе своего выполнения (динамические переменные), возвращая в том и другом случае указатель на него. Для выбора у нее не так уж много возможностей. Это могут быть:
-
глобальные переменные программы;
-
формальные параметры, если они являются массивами, указателями или ссылками, то есть «за ними стоят» другие переменные.
Функция не может возвратить указатель на локальную переменную или на формальный параметр-значение, поскольку они разрушаются при выходе из функции. Это приводит к не обнаруживаемой ошибке времени выполнения.
Пример: функция возвращает указатель на минимальный элемент массива. Массив передается как формальный параметр.
// Результат функции - указатель на минимальный элемент
int *min(int A[], int n){