Программирование >>  Структурное программирование 

1 ... 109 110 111 [ 112 ] 113 114 115 ... 342


Возведение переменной в куб с использованием вызова по ссылке с аргументом указателем #include <iostream.h>

void cubeByReference(int *); прототип

main () {

int number = 5;

cout Исходное значение числа: << number << endl; cubeByReference{Snumber) ;

cout Новое значение числа: number endl; return 0;

void cubeByReference(int *nPtr) {

*nPtr = *nPtr * *nPtr * *nPtr; куб числа в main

Исходное аначвние числа: 5 Новое значение числа: 125

Рис. 5.7. Возведение переменной в куб с использованием вызова по ссылке с аргументом

указателем

Типичная ошибка программирования 5.3

Не разыменовывается указатель, когда это необходимо сделать, чтобы получить значение, на которое указывает этот указатель.

Функция, принимающая адрес в качестве аргумента, должна определить параметр как указатель, чтобы принять адрес. Например, заголовок функции cubeByReference имеет вид

void cubeByReference(int *hPtr)

Этот заголовок указывает, что функция cubeByReference принимает адрес целой переменной как аргумент, сохраняет адрес локально в nPtr и не возвращает значение.

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

В заголовке функции и в прототипе функции, которая ожидает в качестве аргумента одномерный массив, можно использовать запись указателя в списке параметров функции. Компилятор не делает различий между функцией, которая принимает указатель, и функцией, которая принимает одномерный массив. Это означает, конечно, что функция должна знать , принимает ли она массив или просто одну переменную, для которой выполняется передача вызовом по ссылке. Когда компилятор сталкивается с параметром функции в виде одномерного массива, например, int b[ ], он преобразует параметр в запись указателя int * const b (произносится как Ь - это константный указатель на целое - const объясняется в разделе 5.5). Обе формы объявления параметра функции как одномерного массива равнозначны.



Перед тем, как main вызывает cubaByValua:

main О

number

int number = 5;

number s cubaByValua (number) ;

int cubeByValue(int n)

return n * n * n;

undefined

После того, как cubeByValue приняла вызов:

main О

number

int number = 5;

nusiber = cubeByValue (number) ;

int cubeByValue(int n) {

return n * n * n;

После того, как cubeByValue возвела В куб параметр п:

main о

number

int number = 5;

number = cubeByValue (nuinber) ;

int cubeByValue(int n)

{ 125

return (n * n * n;)

После того, как cubeByValue возвращает управление В main:

main О

number

int number s 5;

number (cubeByValue (number))

int cubeByValue(int n)

return n * n *

undefined

После того, как main завершает

main О

number

int number 5;

number = cubeByValue(number);

присваивание number:

int cubeByValue(int n)

return n * n * n;

undefined

Рис. 5.8. Анализ типичного вызова по значению Хороший стиль программирования 5.3

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



Перед вызовом cubeByReference ПО ссылке:

number

main О

int number = 5;

cubeByRaference(finumber); )

void cubeByReference(int *nPtr)

*nPtr = *nPtr * *nPtr * *nPtr;

nPtr

undefined

После вызова cubeByReference ПО ссылке перед возведением *nPtr в куб:

main О int number

number

cubeByReference(finumber); )

void cubeByReference(int *nPtr) (

*nPtr = *nPtr * *nPtr * *nPtr; * nPtr

После возведения *nPtr в куб:

main О (

int number = 5;

number

cubeByReference(Snumber); )

void cubeByReference(int *nPtr) {

(>nPtr = *nPtr * *nPtr * *nPtr;)

nPtr

Рис. 5.9. Анализ типичного вызова по ссылке с аргументом указателем

5.5. Использование спецификатора const с указателями

Спецификация const дает возможность программисту информировать компилятор о том, что значение данной переменной не должно изменяться.

Замечание по технике программирования 5.1

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

Замечание по мобильности 5.1

Хотя спецификация const полностью определена в С ANSI, в некоторых компиляторах она не реализована.



1 ... 109 110 111 [ 112 ] 113 114 115 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика