Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Визначення об'єктів та типів

Поиск

Як вже говорилося вище, всі змінні використовувані в програмах на мові СІ, повинні бути оголошені. Тип оголошуваної змінної залежить від того, яке ключове слово використовується в якості специфікатора типу і чи є описувач простим ідентифікатором або ж комбінацією ідентифікатора з модифікатором покажчика (зірочка), масиву (квадратні дужки) або функції (круглі дужки).

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

Відзначимо важливу особливість мови СІ, при оголошенні можна використовувати одночасно більше одного модифікатора, що дає можливість створювати безліч різних складних описувачів типів.

Однак треба пам'ятати, що деякі комбінації модифікаторів неприпустимі:

- Елементами масивів не можуть бути функції,

- Функції не можуть повертати масиви або функції.

При ініціалізації складних описувачів квадратні і круглі дужки (праворуч від ідентифікатора) мають пріоритет перед зірочкою (зліва від ідентифікатора). Квадратні або круглі дужки мають один і той же пріоритет і розкриваються зліва направо. Специфікатор типу розглядається на останньому кроці, коли описувач вже повністю проінтерпретований. Можна використовувати круглі дужки, щоб поміняти порядок інтерпретації на необхідний.

Для інтерпретації складних описів пропонується просте правило, яке звучить як "зсередини назовні", і складається з чотирьох кроків.

1. Почати з ідентифікатора і подивитися вправо, чи є квадратні або круглі дужки.

2. Якщо вони є, то проінтерпретувати цю частину описувача і потім подивитися ліворуч в пошуку зірочки.

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

4. Інтерпретувати специфікатор типу.

Приклади:

int * (* comp [10]) ();

6 5 3 1 2 4

У даному прикладі оголошується змінна comp (1), як масив з десяти (2) покажчиків (3) на функції (4), що повертають покажчики (5) на цілі значення (6).

char * (* (* var) ()) [10];

7 6 4 2 1 3 5

Змінна var (1) оголошена як покажчик (2) на функцію (3) повертаючу покажчик (4) на масив (5) з 10 елементів, які є покажчиками (6) на значення типу char.

Крім оголошень змінних різних типів, є можливість оголосити типи. Це можна зробити двома способами. Перший спосіб - вказати ім'я тега при оголошенні структури, об'єднання або перерахування, а потім використовувати це ім'я в оголошенні змінних і функцій в якості посилання на цей тег. Другий - використовувати для оголошення типу ключове слово typedef.

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

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

Приклади:

typedef double (* MATH) ();

/ * MATH - нове ім'я типу, що представляє покажчик на

функцію, що повертає значення типу double * /

MATH cos;

/ * Cos покажчик на функцію, що повертає

значення типу double * /

/ * Можна провести еквівалентне оголошення * /

double (* cos) ();

typedef char FIO [40]

/ * FIO - масив із сорока символів * /

FIO person;

/ * Змінна person - масив із сорока символів * /

/ * Це еквівалентно оголошенню * /

char person [40];

При оголошенні змінних і типів тут були використані імена типів (MATH FIO). Крім цього, імена типів можуть ще використовуватися в трьох випадках: у списку формальних параметрів, в оголошенні функцій, в операціях приведення типів і в операції sizeof (операція приведення типу).

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

специфікатор-типу абстрактний-описувач;

Абстрактний-описувач - це описувач без ідентифікатора, що складається з одного або більше модифікаторів покажчика, масиву або функції. Модифікатор покажчика (*) завжди задається перед ідентифікатором в описувач, а модифікатори масиву [] та функції () - після нього. Таким чином, щоб правильно інтерпретувати абстрактний описувач, потрібно почати інтерпретацію з подразумеваемого ідентифікатора.

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

Питання для контролю:

1. Який синтаксис має об’єднання?

2. Яким чином визначаються об’єкти?

3. Що таке абстрактний описувач?

Література:

1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 183-195

Урок №21

(згідно робочої навчальної програми)

 

Тема: Оголошення і розіменування покажчиків, покажчики як псевдоніми, покажчики і перевірка типів

Питання:

1. Методи доступу до елементів масивів.

2. Покажчики на багатовимірні масиви

3. Операції з вказівниками

Методи доступу до елементів масивів

У мові С між покажчиками і масивами існує тісний зв'язок. Наприклад, коли оголошується масив у вигляді int array [25], то цим визначається не тільки виділення пам'яті для двадцяти п'яти елементів масиву, але і для покажчика з ім'ям array, значення якого дорівнює адресою першого за рахунком (нульового) елемента масиву, т.е. сам масив залишається безіменним, а доступ до елементів масиву здійснюється через покажчик з ім'ям array. З точки зору синтаксису мови покажчик arrey є константою, значення якої можна використовувати у вираженнях, але змінити це значення не можна.

Оскільки ім'я масиву є покажчиком допустимо, наприклад, таке присвоєння:

int arrey [25];

int * ptr;

ptr = array;

Тут покажчик ptr встановлюється на адресу першого елемента масcіва, причому присвоювання ptr = arrey можна записати в еквівалентній формі ptr = & arrey [0].

Для доступу до елементів масиву існує два різні способи. Перший спосіб пов'язаний з використанням звичайних індексних виразів у квадратних дужках, наприклад, array [16] = 3 або array [i +2] = 7. При такому способі доступу записуються два вирази, причому другий вираз полягає у квадратні дужки. Одне з цих виразів повинно бути дороговказом, а друге - виразом цілого типу. Послідовність запису цих виразів може бути будь-який, але в квадратних дужках записується вираз наступне другим. Тому записи array [16] і 16 [array] будуть еквівалентними і позначають елемент масиву з номером шістнадцять. Покажчик використовуваний в індексному вираженні не обов'язково повинен бути константою, що вказує на який-небудь масив, це може бути і змінна. Зокрема після виконання присвоювання ptr = array доступ до шістнадцятого елементу масиву можна отримати за допомогою покажчика ptr у формі ptr [16] або 16 [ptr].

Другий спосіб доступу до елементів масиву пов'язаний з використанням адресних виразів і операції разадресаціі у формі * (array +16) = 3 або * (array + i +2) = 7. При такому способі доступу адресний вираз рівне адресою шістнадцятого елемента масиву теж може бути записано різними способами * (array +16) або * (16 + array).

При реалізації на комп'ютері перший спосіб приводиться до другого, тобто індексне вираз перетвориться до адресного. Для наведених прикладів array [16] і 16 [array] перетворяться в * (array +16).

Для доступу до початкової елементу масиву (тобто до елементу з нульовим індексом) можна використовувати просто значення покажчика array або ptr. Будь-яке з присвоюванням

* Array = 2;

array [0] = 2;

* (Array +0) = 2;

* Ptr = 2;

ptr [0] = 2;

* (Ptr +0) = 2;

присвоює початкового елементу масиву значення 2, але швидше за все виконаються присвоювання * array = 2 і * ptr = 2, так як в них не потрібно виконувати операції додавання.



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 361; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.218.216 (0.009 с.)