Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

4.10.2. Перетворення типів

Якщо операнди операцій належать до різних типів даних, то компілятор автоматично здійснює зведення типу до одного спільного. Операнди з меншим діапазоном зазвичай зводяться до операндів з більшим:

char c;

int i;

c=i;

Для цілих типів при присвоюванні значення змінної більшого за розміром типу змінній меншого відкидаються старші біти. Якщо значення змінної меншого типу присвоюється змінній більшого, у зайві біти копіюється знаковий біт або нуль.

При присвоюванні значення змінної плаваючого типу змінній цілого воно перетворюється на значення змінної типу int, а потім – типу операнда, що стоїть у лівій частині операції присвоювання.

Розглянемо фрагмент програми, що переводить послідовність цифр у числовий еквівалент:

Int atoi(char s[]) /*char* s*/

{int i,n=0;

for (i=0;s[i]>'0' && s[i]<'9';i++)

n=n*10+(s[i]-'0');

return n;

}

Тут у рядку n=n*10+(s[i]-'0'); у результаті віднімання s[i]-'0' отримуємо числове значення (цифру), що задається символом s[i]. Дійсно, s[i] містить код відповідної цифри. Щоб отримати числове значення, необхідно врахувати, що цифри розміщуються в системі кодування підряд, цифра '0' як символ також має деякий код (для нас не важливо, який саме). Множення на 10 у циклі дозволяє постійно зсувати цифрове зображення ліворуч, залишаючи вільним молодший розряд для нової цифри. Розглянемо роботу програми.

Нехай на вхід функції подається рядок "3246". Результати роботи програми подано у табл. 4.2.

Таблиця 4.2

ітерації (i)

Значення s[i]

Значення n у циклі

0

'3'

3

1

'2'

32

2

'4'

324

3

'6'

3246

4.10.3. Засіб typedef

Мова С має спеціальний механізм, який дозволяє давати певним конструкціям для визначення типу нові імена типів:

typedef<специфікатор типу><описувач>[<описувач>,..]

typedef int*pint;

Синтаксичне визначення засобу typedef аналогічне оголошенню. Відмінність полягає лише в тому, що замість специфікатора класу пам'яті стоїть ключове словоtypedef.При цьомуідентифікаторв описувачі виступатиме як ім'я нового типу даних. Наприклад:

typedef (*(*** newtype) [10]) (char*,int*)

newtype a,b,c;

При визначенні типу з використанням покажчиків на структуру допускається використання імені структури до її визначення. Наприклад:

typedef struct students *treeptr;

struct student

{char name [20];

Int curs;

treeptr left,right;}

Засіб typedef аналогічний макровизначенню #define. Однак існують ситуації, коли через директиву #define неможливо визначити конструкцію, яка визначається через директиву typedef. Наприклад:

typedef int*(*pfun)(char*,char*);

pfun a; //це аналогічно int *(*a)(char*,char*);

typedef використовується:

 для визначення читабельніших типових конструкцій;

 для скорочення оголошень;

 для визначення типів даних, що не залежать від реалізації операційної системи й типу комп'ютера;

 з естетичних міркувань.

4.10.4. Покажчики та масиви

Покажчики. Покажчик – це змінна, яка зберігає адресу об'єкта деякого типу. Покажчик на функцію містить адресу точки входу у функцію. Синтаксично визначення покажчика задається як [<тип>]*<описувач>. Наприклад:

int * pi, i=12;

pi=&i;

<тип> може задавати базовий тип, перераховний, структурний та об'єднання.

Особливе місце займають покажчики на тип void. Покажчик на void може вказувати на значення будь-якого типу (містити адресу елемента будь-якого типу). Наприклад: