- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Описание неизменяемых объектов
Если какой-то объект программы не изменяется во время ее выполнения (например, число PI), то его можно описать с модификатором const. Про трансляции проверяется этот объект на изменение и в этом случае будет генерироваться ошибка. Эти объекты могут быть локальными и глобальными, статическими и динамическими.
Пример:
const double PI=3.14159265;
Указатели
Указатель - это переменная, содержащая адрес некоторых данных, а не их значение. Он может быть использован для доступа к ячейкам памяти ЭВМ, для создания новых переменных в ходе выполнения программы (путем динамического отведения памяти под эти переменные), для доступа к различным элементам структур данных путем индексирования указателя.
Описание указателя:
<модификаторы> <тип указателя> *<имя объекта>
Модификаторы используются те же, что и при описании объектов в программе.
Примечание: в качестве типа указателя кроме обычных допустимо применение пустого типа void. Это означает, что при инициализации указателя кроме определения адреса будет инициализирован также и его тип.
Примеры:
1.
main()
{
int a,*b;/* описание объекта целого типа а и указателя b */
a=134;
b=&a;
printf("\nЗначение а=%d",a); /* = 134 */
printf("\nАдрес а=%p",&a);
printf("\nДанные по адресу указателя b=%d",*b); /* = a */
printf("\nЗначение указателя b=%p",b); /* = &a */
printf("\nАдрес расположения указателя b=%p",&b);
}
2. Вывод на терминал символьной строки на машине класса PDP-11 в однопользовательской среде. При этом используются восьмеричные адреса 16-тиричных регистров: 177564 - адрес регистра состояния экрана терминала, 177566 - адрес регистра данных экрана терминала. Если в 8-м бите регистра состояния экрана терминала 1-ца, то это означает, что экран готов принять код символа, который направляется по адресу регистра данных экрана терминала и записывается в младший его байт (старший байт этого регистра не используется).
main()
{
char *c="Все в порядке!";
/* значение указателя инициализируется
адресом начала символьной строки */
int *term,i;
term=(int *)0177564; /* адрес регистра состояния экрана */
i=0; /* счетчик числа выведенных символов */
/* цикл */
while (*(c+i)!=0) /* исчерпаны ли все символы */
{
/* проверка готовности экрана терминала */
while ((*term&0200)==0) ;
/* вывод символа на экран терминала */
*(term+1)=*(c+i); /* пересылка по адресу 0177566 */
/* увеличение счетчика числа выведенных символов */
i++;
}
}
3. Объединение различных переменных в массив.
main()
{
int a,b,c,*point[3]; /* point - массив указателей */
a=123; b=234; c=345;
/* использование объектов a,b,c */
. . .
/* объединяем переменные в массив */
point[0]=&a;
point[1]=&b;
point[2]=&c;
/* печатаем данные */
printf("\na=%d a=%d",a,*point[0]);
printf("\nb=%d b=%d",b,*point[1]);
printf("\nc=%d c=%d",c,*point[2]);
}
Примечание: использование в выражениях символических имен массивов эквивалентно использованию указателя на массив, то есть адреса первого элемента массива. Если в выражениях используется символическое имя функции, то это эквивалентно использованию адреса начала функции.
Явное преобразование типа
Если необходимо явным образом изменить тип данных, используемых в выражениях, то перед объектом в круглых скобках указывается тип данных, который необходимо получить.
Пример:
main()
{
int i,j;
long k;
i=30000; j=20000;
k=i+j; /* Ошибка !
Несмотря на то, что k описана как long,
результат вычисления i+j вышел за границы
типа int. Результат неопределен. */
...
}
main()
{
int i,j;
long k;
i=30000; j=20000;
k=(long)i+j; /* Теперь все в порядке. Тип выражения
справа long. При вычислении значение j преобразуется
к типу long. */
...
}