Рекомендации по программированию. 1) При работе с указателями необходимо внимательно выполнять операции увеличение и уменьшение.

1) При работе с указателями необходимо внимательно выполнять операции увеличение и уменьшение.

Например, выражения дают различные результаты.

a) (* p) ++

б) * p ++

в) * ++ p

В первом случае увеличивается значение переменной, размещенной по указателю p.

Во втором случае извлекается значение по указателю p, а затем значение указателя p увеличивается.

В третьем случае сначала увеличивается значение указателя, а затем извлекается значение переменной размещенной по новому адресу.

При выполнении операции увеличение и уменьшение на количество байтов, занимаемое переменной, связанной с указателями.

2) Операция увеличение и уменьшение постфиксные и префиксные не могут применяться к имени массива, т.к. имя массива является константой указателя.

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

Пример:

int a [10], * p;

a++; / * ошибка * /

p = a;

p++;

3) Определение int a [ ]; и определение int * a; эквивалентны. Оба определения говорят, что а является указателем на целое.

4) Следует различать выражения

char ( * fun ) ( );

char * fun ( );

В первом случае определяется указатель на функцию.

Второй оператор описывает функцию, возвращающую указатель на символ.

5) Классическим примером ошибки с указателем является неинициализированный указатель.

Пример:

/ * неправильная программа * /

int main (void)

{ int x, * p;

x = 10;

* p = x;

return 0;

}

Данная программа присваивает значение 10 некоторому неизвестному участку памяти.

Указатель p не получает адреса памяти, который можно использовать. Следовательно, он содержит неопределенное значение. Такого рода ошибки часто незаметны в небольших программах, но для больших программ велика вероятность зависания. Решение: Следует убедиться, что указатель указывает на некоторую допустимую область. Частая инициализация указателей или некорректная инициализация затрудняет поиск ошибок.

Функции.

Функция – это независимое множество операторов для выполнения некоторой задачи.

Определение функции:

заголовок функции

{ тело функции}

В заголовке функции указывается класс_памяти описатель_типа имя (список параметров) описание_параметров. Тело функции – это простой оператор, или группа операторов.

Класс памяти определяется с помощью ключевых слов extern или static. Внешний (extern) класс памяти означает, что функция будет доступна, как в данном программном модуле, так и в других отдельно скомпилированных модулей.

Статический ( static) класс памяти означает, что функция будет доступна только в модуле, ограниченным данным исходным файлом.

По умолчанию принимается класс памяти внешний (extern).

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

Для задания описателя типа используются ключевые слова shot, long, unsigned, int, char, float, double, произвольный тип, void. Типы shot и char автоматически преобразуются в int, а float в double.

Описатель void используется в том случае, если функция не возвращает значение. Например, если функция осуществляет только печать некоторых значений. По умолчанию принимается тип int.

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

Имя – это любой идентификатор языка " C ". После имени обязательно круглые скобки, независимо от того имеет функция параметры или нет.

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

Рекомендуется описание каждого параметра размещать с новой строки, если описание какого-либо параметра отсутствует, то по умолчанию этот параметр имеет тип int и автоматический класс памяти.

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

Пример 1:

void / * функция не возвращает никакого значения * /

f1 ( s1,n) / * имя функции и список параметров * /

int * s1;

int n; / * описание параметров * /

{ int i;

for ( i = 0; i<n, i++) / * тело функции * /

printf(" % d % C ",* (s1 + i),(i % 10 = = 9 ||i = = n-1)?'n':");

}

Пример2:

main ( ) / * функция не содержит параметров * /

{ int a;

char c; / * переменные а и с являются локальными * /

a = 3;

c = a;

printf ( " a = % d, c = % c ", a,c );

}

Пример ( наименьшая функция)

f ( )

{

}

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








Дата добавления: 2016-04-14; просмотров: 479;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.01 сек.