- •Рецензенты:
- •Лекция 1 Основные понятия языка с
- •Первая программа
- •Переменные языка с
- •Имя переменной
- •Объявление константы
- •Операции языка с
- •Лекция 2 Операторы языка с Условный оператор
- •Оператор switch
- •Циклы Цикл for
- •Циклы while и do-while
- •Оператор безусловного перехода
- •Использование операторов break, continue и goto в циклах
- •Операция условие ?
- •Лекция 3 Массивы
- •Инициализация массивов
- •Массивы символов. Строки
- •Функции для работы со строками
- •Лекция 4 Указатели
- •Объявление указателей
- •Операции над указателями
- •Связь указателей и массивов
- •Массивы указателей
- •Инициализация указателей
- •Лекция 5 Функции языка с
- •Объявление функции
- •Оператор return
- •Прототипы функций
- •Функции c произвольным числом параметров
- •Область действия и область видимости переменной
- •Классы памяти
- •Параметры и аргументы функции
- •Лекция 6 Типы, определяемые пользователями
- •Структура
- •Перечислимый тип
- •Переименование типов-typedef
- •Лекция 7 Модели памяти и препроцессор языка с Модели памяти
- •Препроцессор языка с
- •Директива #define
- •Список рекомендуемой литературы
- •Оглавление
- •Программирование на языках высокого уровня: с
- •428015 Г.Чебоксары, Московский просп., 15
Инициализация указателей
После того как указатель был объявлен, но до того, как ему было присвоено какое-то значение, указатель содержит неизвестное значение. Попытка использовать указатель до присвоения ему какого-то значения является неприятной ошибкой, так как она может нарушить работу не только программы, но и операционной системы. Даже если этого не произошло, результат работы программы будет неправильным и найти эту ошибку будет очень сложно.
Принято считать, что указатель, который указывает в "никуда", должен иметь значение null. Однако и это не делает его "безопасным". После того как он попадет в правую или левую часть оператора присваивания, он вновь может стать "опасным".
С другой стороны нулевой указатель можно использовать, например, для обозначения конца массива указателей.
point имеет тип указатель на указатель на int. Соответственно, чтобы получить целочисленное значение переменной, на которую указывает point, надо в выражении использовать **point. Пример использования:
Программа 4.8:
#include<stdio.h>
void main()
{int i, *pi, **ppi;
i=7;
pi=&i;
ppi=π
printf(“i=%d pi=%p ppi=%p\n”, i, pi,ppi); // i=7 pi=4E97:2210 ppi=4E97:220C
pi++;
printf(“i= %d pi - %p ppi = %p \n", i, pi, ppi); // i=7 pi-4E97:2212 ppi=4E97:220C
}
Если была попытка присвоить какое-либо значение тому, на что указывает указатель с нулевым значением, система выдает предупреждение, появляющееся во время работы программы (или после окончания работы программы) "Null pointer assignement". Появление этого сообщения является поводом для поиска использования неинициализированного указателя в пpoграмме.
Ссылки
Операция & означает ссылку, если она используется в следующем контексте Тип &<имяПеременной> = <инициализующее выражение>;
Ссылка существенно отличается от указателя. О переменной, объявленной выше, говорят, что это “ссылка на тип”. Она определяет местоположение в памяти инициализирующего выражения <инициализующее выражение>.
Чем же отличается ссылка от указателя? Рассмотрим следующий пример:
Программа 4.9:
#include<stdio.h>
void main() {
int y=16;
int &x=y;
printf(“x= %d\n", x);
y=12;
printf(“x= %d\n",x);
printf(“x=%p\n”,&x);
printf("address y= %p \n", &y);
}
Результат работы
X=16
X=12
&X=4EF5:2204
Address у=4EF5:2204
Ссылочная переменная х определяет местоположение переменной у в памяти в инициализирующем выражении int &x=y. Переменная х обрабатывается как нормальная переменная типа int. При обращении к такой переменной нет необходимости в операции снятия ссылки. Когда переменной у присваивается значение 12, то переменная х принимает новое значение, поскольку она определяет местоположение переменной у в памяти.
Функциональный эквивалент приведенного выше примера выглядит следующим образом:
Программа 4.10:
#include<stdio.h>
void main() {
int у=16;
int *x=&y;
printf("x=%d \n", *x);
у=12;
printf("х= %d \n", *x);
printf("x=%p \n", х);
printf("address y=%p \n", &y);
}
Результат paбoты этого кода будет аналогичен предыдущему.
Ссылочная переменная должна быть при объявлении инициализирована. Объявление int &х; не допустимо, поскольку неизвестно на что указывает переменная х.
Рассмотрим следующий пример инициализации ссылочных переменных:
Программа 4.11:
#include<stdio.h>
void main() {
float data[5]={0.0,1.0,2.0,3.0,4.0);
float &ref=dala[3];
printf(“ref=%0.3f\n", ref);
for(int i=0; i<5;i++){
data[i]=(float)-i;
printf(“data[ %d]= %0.2f\n", i, data[i]);
}
printf("ref %0.3f\n", ref);
ref=10;
printf("ref=%0.3f\n", ref);
printf("dala[3]= %0.2f\n", data[3]);
}
Результат работы программы
ref=3.000
data[0]=0.00
dala[1]=-1.00
data[2]=-2.00
data[3]=-3.00
dala [4]=-4.00
ref=-3.000
ref=10.000
data[3]=10.00
