Программирование на C и C++

Онлайн справочник программиста на C и C++

Инициализация указателей

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

По существующим соглашениям неиспользуемый указатель должен содержать нулевое значение. То, что указатель имеет нулевое значение, не обеспечивает безопасности. Если использовать нулевой указатель слева от оператора присваивания, это может привести к «зависанию» программы.

Поскольку предполагается, что нулевой указатель не используется, можно его использовать для упрощения большинства подпрограмм, работающих с указателями. Например, можно использовать нулевой указатель для пометки конца массива указателей. Если это сделано, то процедура, осуществляющая доступ к массиву, будет знать, что она достигла конца массива при обнаружении нулевого значения. Данный способ реализации функции search() показан ниже:

/* Ищем имя */
int search(char *р[], char *name)
{
register int t;
for(t=0; p[t]; ++t)
if(!strcmp(p[t], name)) return t;
return -1; /* не найдено */
}

Цикл for в search() запускается каждый раз при обнаружении нулевого указателя. Поскольку конец массива помечен нулем, условие, управляющее циклом, останавливает цикл (выдает ложное состояние) при достижении конца массива.

При профессиональном написании программ типично инициализировать строки. Пример этого был показан в функции serror(). Ниже приводится другой вариант объявления строк:

char *р = "hello world\n";

Как можно видеть, указатель р - это не массив. Все компиляторы С создают так называемую таблицу строк, используемую компилятором для хранения строковых констант, используемых программой. Следовательно, данный оператор объявления помещает адрес "hello world" в указатель р. р может быть использован в программе как обычная строка. Например, следующая программа абсолютно корректна:

#include <stdio.h>
#include <string.h>
char *p = "hello world";
int main(void)
{
register int t;

/* вывод строки в прямом и обратном порядке */
printf(р);
for(t=strlen(р)-1; t>-1; t--) printf ("%c", p[t]);
return 0;
}