ПредишенСледващото

"За единство в съвкупност, но еднообразието на разделението Не търсете".
Козма барове.

Масив от указатели като тип данни, и като структура от данни


Един набор от указатели (MU) - елементарен структурата на данните, при което разлика се появява между физически и логически ред на елементите. Метод за организиране на данни вече е ясно от определението: масив, всеки елемент от които съдържа указател към променлива (обект).

масив от указатели

Фиг. 62.1. Разликата между масив от указатели - вида и структурата на данните

Ако е писано по отношение на определенията контекста на променливите, ще видим, например,

Променливата стр да се разбира като масив (Стъпка []), като всеки елемент от които е указател към променлива от тип двойно (операция *). Променливата р е масив от указатели като тип данни, но тя не е такава, че структурата на данните. За да се превърне структурата на данните трябва да бъде допълнена ukazuemymi променливи и указатели (облигации).

Разнообразието от възможности за изпълнение на масиви от указатели възниква поради няколко причини:

· С и масив от указатели, променливи и ukazuemye връзки (указатели) може да се настрои статично (в програмата), или динамично създаден по време на неговото изпълнение;

· Двояка интерпретация на показалеца като указател към отделна променлива и променлива масив (низ), можете да създадете едномерна LED - масиви от указатели към променливи и двуизмерни - масиви от указатели към масиви (редове) на променливите;

· Ukazuemye променливи могат да бъдат "собственост" на структурата на данните, но масив от указатели, и могат да се отнасят до променливи (обекти), които са част от други структури от данни.

Основната трудност се крие във факта, че във всички случаи, като се използват едни и същи видове данни, както и специфичен вид структурата на данните се определя от контекста на използването им в програмата.

типове данни, използвани при работа с масиви от указатели


Един вид на данни вече е посочена нас - това е масив от указатели, променлива тип Int * р []. В допълнение той използва още един вид тип Int ** стр. което може да се определи най-общо като указател към указател.

Фиг. 02 юни 0.2. Разнообразието от интерпретации на INT на тип данни ** п

Спомнете си, че в C има две интерпретации на позицията на курсора, за да се разграничи коя програма текст може да се използва само по външен вид на операциите по показалеца (т.е. само в контекста на използването му):

· Традиционният тълкуването на показалеца като препратка към отделна променлива отговаря за експлоатацията на показалеца околен * РР;

А указател към указател по такъв начин, позволява най-много четири интерпретации. В допълнение, за всеки от тях трябва да се настрои (инициализира) има своя собствена структура на данните. Ситуацията се усложнява допълнително от факта, че за съответните структури от данни и операции по нея трябва да гарантира, програмист (съставител не прави това).

Int а = 5, б = 10; Int * р = с; Int ** п = р;

Int на [10] = 5, б [10] = 10; Int * р = с; Int ** п = р;

за (INT I = 0; и<10;i++) (*pp)[i]=0;


Вторият вариант е също доста екзотично - указател към указател към линеен масив от променливи. Изразите, които се използват в такава структура на данните съдържа приоритетни скоби като операция околен път на първо ниво предхожда действието на индексиране на първия.

В други изпълнения, Int тип ** данни се използва за масиви от указатели. Класически тълкуване - указател към масив от указатели към отделни обекти, използвайки естествения ред на операции * Р [Ь] за достъп ukazuemym обекти.

за (= INT е 0, I = 0; и<10;i++) s=s+*pp[i];

Масив от указатели към променливите на линейни масиви е двуизмерна структура на данните и използва двойно индексиране. Функционално, това е еквивалентно на двумерен масив.

за (= INT е 0, I = 0; и<3;i++)

за (Int J = 0; J<4;j++) s=s+pp[i][j];

Статични и динамични масиви от указатели

Друг източник на разнообразие - метод за образуване на горните структури от данни. Статично масив от указатели, генерирани по време на транслация: променливите (указатели на масив и ukazuemye променливи) са дефинирани статично като конвенционални наречени променливи и указатели се инициализират. Структурата на данни е включен директно в кода и "готов да отиде".

за (I = 0; и<19; i++) pd[i] = &d[i];

И накрая, ако показалка масива се формира като динамична структура данни, динамичният масив от указатели се създава по време на операцията по програма. Операция като нов връща указател към паметта, съдържащ насоки т.е. тип Int **. която се съхранява в променлива от същия тип.

п = newint * [20]; // памет за масив от указатели

за (I = 0; и<19; i++)

стр [Ь] = р; // може PP [Ь] = ново междинно съединение; * Pp [Ь] = I;


Масив от указатели. Физическа и логическа последователност

Когато се работи с масив от указатели се използват две ситуации:

- стр [Ь] -i-ти индекс в масива;

- * Pp [Ь] е стойността на I-та променлива ukazuemoy.

Алгоритми за работа с масив от указатели, както и обичайния набор от външно много сходни. Разликата е, че поставянето на данни по конвенционален спектър съответства на тяхното физическо цел в паметта на последователност, и множество указатели позволява да се генерира логическия ред на елементите в съответствие с указателите да ги намери. След смяната на последователност (включване, изключване, поръчване пермутация), който в нормален масив е да се движат сами елементите в масив от указатели трябва да бъде придружено от операции върху указатели към тях. Очевидните предимства възникват, когато ukazuemye самите променливи са достатъчно големи, или да ги движат невъзможно поради някаква причина (например, те са посочени в други части на програмата). За сравнение, ние сортирате функция масив и масивът от указатели.

// --- сортиране масив и масив от указатели

невалидни sort1 (двойна г [], Int SZ)

за (к = 0, I = 0; и

невалидни sort2 (двойна * Pd [])

за (к = 0, I = 0; Pd [Ь + 1] = NULL ;! и ++)

ако (* PD [I]> * Pd [Ь 1]) // Сравни ukazuemyh променливи

с = Pd [Ь]; Pd [Ь] = Pd [Ь + 1]; Pd [I + 1] = С; к = 1;>

Един динамичен масив от указатели към променливи (обекти)

Ако динамичен масив от указатели, отнасящи се до набор от "вече са известни", т.е. те не са създадени, и то не е собственост на променливите (обектите), е целесъобразно да се разглежда като съвкупност има свой собствен логичен ред. Като пример, помислете за функция, която създава масив от указатели към положителни стойности, отчетени от редица нареди възходящ. Както при всеки динамичен масив индексите на масивите са всички валидни заключения за неговото измерение: в този случай, тя може да бъде изчислена предварително. Резултатът от функцията е тип двойно ** - указател към динамичен масив от указатели, създаден в рамките на функцията.

// -------- динамичен масив от указатели

// да подредени положителни елементи на оригиналния масив

двойно ** създаде (двойна в [], Int п)

Int аз. к. m; // Изчислете измерение

за (I = 0, m = 0; и0) M ++;

двойно ** п = новата двойно * [М + 1]; // Създаване на DMU

за (I = 0, J = 0; и

ако (в [Ь]> 0) стр [й ++] = в [Ь]; // положителен елемент

Един динамичен масив от указатели към масиви от променливи

масив от указатели


Фиг. 06 фев 0.3. Представяне шаблон променлива величина като DMU на линия

// --- Матрицата произволни размери - масив от указатели към масиви

двойно ** натоварване (овъгляване пМ [], Int п. инт т)

ако (FD == NULL) връщане NULL;

fscanf (FD, "..", п, т); // четене размерите

двойно ** п = новата двойно * [п]; // Създаване на DMU на първото измерение

стр [Ь] = новата двойно [m]; // Създаване Линеен DM (редове)

за (Int J = 0; J

Свързани статии

Подкрепете проекта - споделете линка, благодаря!