Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Описание неизменяемых объектов

Если какой-то объект программы не изменяется во время ее выполнения (например, число 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. */

...

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]