voidmain ()
{ intn; floatrp; charhc;
voidVvod_Z(int *,char *,float *);
Vvod_Z (&n,&hc,&rp);
if (n>5) printf("\n symbol = %c",hc);
else printf("\n number = %f",rp);
}
Vvod_Z(int *m,char *ch,float *pr)
{*m = 10; *ch =’D’; *pr = 145.87; }
Если в функции Vvod_Z() значения трех переменных вводятся с клавиатуры с помощью функции scanf(), как в примере 3.6, то операция разыменования не используется, т.к. аргументы функции Vvod_Z() – адреса.
Пример 3.6.
Vvod_Z(int *m,char *ch,float *pr)
{ printf("\n Enter number (type int) = "); scanf("%d",m);
fflush(stdin);
printf("\n Enter symbol = "); scanf("%c",ch);
printf("\n Enter number (Type float) = "); scanf("%f",pr);
}
Замечание. Функция fflush() с аргументом stdin (из библиотеки <stdio.h>) очищает входной поток. Если входной поток не очистить, то последующий ввод символа при спецификации %c, как правило, не осуществляется, т.к. в потоке stdinв этот момент находится управляющий символ, соответствующий клавише “Enter”.
КОНТРОЛЬНЫЕ ВОПРОСЫ И ЗАДАНИЯ
1. Оператор b = &f; означает, что значение переменной b равно:
a) адресу переменной f;
b) значению переменной f ;
c) содержимому по адресу f .
Как должны быть объявлены переменные b и f ?
2. Фрагмент программы:
float *qq; floatBB[10]; qq=&BB[0];
qq – переменная или константа? BB – переменная или константа?
Являются ли допустимыми выражения: qq++, BB++?
3. Какие выражения из перечисленных являются эквивалентными:
a[i]; i[a]; *(a+i); *(i+a); ++*(a+i); *(a+i)++; ++*(i+a); *(i+a)++; a[i]++; ++i[a]?
Объявите переменные iиa перед ответом на вопрос об эквивалентности записей.
4. В каком случае два оператора эквивалентны? Как должны быть объявлены переменные ?
free(ptr); ptr=realloc(p1,size);
5. Почему результат выполнения функций malloc(), calloc(), realloc () может быть присвоен указателю на объект любого типа?
6. Какие из операторов могут быть написаны синтаксически верно и в каких случаях? Как должны быть объявлены (и инициализированы) соответствующие переменные ?
scanf ("%c",&K);
scanf ("%d",H);
printf ("%p",&G);
printf ("%f",*S);
7. Укажите эквивалентные фрагменты программы, следующие (по одному) за операторами
int arr[4] = {2, 3, 4, 5}; int *ptr; ptr=arr;
Фрагмент 1. ––*ptr++; Фрагмент 2. ––(*ptr++);
Фрагмент 3. ––(*ptr); ptr++; Фрагмент 4. *ptr=2;
Фрагмент 5. *ptr=3; Фрагмент 6. *ptr=4;
8. Если следующие операторы записаны синтаксически верно, то какое значение переменная t принимает после выполнения операторов:
float y[6],*ptr,*pp; int t; ptr=y; pp=y[3]; t= pp – ptr;
9. Какие значения переменные t и s принимают после выполнения операторов (если приведенные операторы могут служить логически связанным фрагментом программы):
int t=6, *ptr, s; ptr=&s; *ptr=8; t+= --*ptr+s;
10. Какие значения принимают переменные (имеются в виду переменные, значения которых определяются однозначно) после выполнения операторов:
int t=6,*ptr, a[2]={'3','8','6'}; ptr = a; a[1]-= a[0];
t+= * ++ptr + a[1];
Если имеются синтаксические ошибки, исправьте их.
11. Какие значения принимают элементы массива x, переменная y и как меняется значение переменной j после выполнения каждого оператора фрагмента программы:
int x[] = {0, 2, 4, 6}, *j, y;
j = x;
y =*j;
y =*j++;
y = ++*j;
y = *++j;
y = (*j)++;
y =++(*j);
12.Что будет на экране после выполнения программы:
#include <stdio.h>
void main (void)
{ char A[]="jhon", * ptr = A, ch;
while (ch = *ptr++)
switch (ch)
{ case 'j':
case 'h': printf ("%c", 'e'); break;
case 'n': printf ("%c", 'w');
default : printf ("%c", 'a');
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.