Рекомендации по программированию. 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; просмотров: 522;