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

Указатели към функции

двойно грях (двойна х); двойни COS (двойно х); двойно тен (двойна х);

Може да се опише, както и указател към функция. Например, за функция с аргумент на двойно тип, който връща стойност от тип двойно, описанието на индикатора е както следва:

двойно (* Fn) (двойна х);

Тук, както и в случай на указател към масив скоби увеличи приоритет на операцията *. Ако те отсъстват, това ще бъде описано не е указател към функция, функция, която връща указател да се удвои.

След описаната функция показалеца прави следните операции:

Fn = грях; / * Стрелката Настройка грях функция * / а = Fn (х); / * Обадете се на функция греха чрез показалеца * / Fn = защото; / * Указател към функция Настройка защото * / б = Fn (х); / * Извика функцията COS чрез показалеца * /

Тя може да бъде описан като масив от указатели към функция и инициализира

Сега е възможно да се следния цикъл:

ФОРМАТ ( "F (х) =% LF \ п", fnArray [Ь] (х));

Можете да се опише функцията връща указател към функция:

двойно (* fnFunc (междинно съединение I)) (двойна х)

При 0. връщане грях; случай 1. защото за връщане; 2. При връщане тен;

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

След като описва функция става възможно fnFunc следния цикъл:

ФОРМАТ ( "F (х) =% LF \ п", fnFunc (I), (х));

Масивите и указатели

и извършва прехвърлянето:

па [0] или * па означава [0]; па [1] или * (PA + 1) означава [1];

па [2] или * (PA + 2) означава [2], и т. д. Като цяло, означението на форма * (PA + п) и па [п] са напълно еквивалентни. По подобен начин, еквивалентен израз * (а + I) и [I].

На пръв поглед изглежда, че масива и показалеца са напълно равностойни. Въпреки това, има две съществени разлики между масив от указатели:

Int А [20], * рА = A; двойно В [20], * рВ = В;

За указатели дефинирани инкремент и декремент операции на стойност цяло число като алтернативна форма на изразите

рА = рА + I; еквивалентни на рА + = I; рА = рА - I; еквивалентни на рА - = I;

рА = рА + 1; еквивалентни на PA ++; или ++ Ра;

рА = рА - 1; еквивалентни pA--; или --pA; В този случай, работата на префикс и постфиксна операции ++ и - съвпада с тяхната работа за данни аритметични.

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

в сравнение указатели са указатели към елементи на едни и същи данни, или ако те се подлагат на предварително нормализиране (вж. по-долу).

Следният код илюстрира използването на горните операции,

двойно А [100], * PA, * pA100; Int I;

/ * Напълнете масив A. работа с множество * / за (I = 0; и<100; i++) A[i]=0;

/ * Напълнете масив А. работна указател * / за (рА = A, pA100 = рА + 100 Ра

Вторият вариант може да запълни на масива може да бъде по-ефективна.

Указатели и двумерни масиви

Да предположим, че имаме следното определение на масиви и указатели:

Int * р (* Ра) [4] [2], (* pAstr) [2];

Тук, А представлява двумерен масив от четири реда и две колони, Б - двумерен масив от елементи. За всяка от тези масиви ще бъдат разпределени съответно количество памет достатъчна за съхранение на всичките им елементи.

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

Смисълът на тези тълкувателни насоки за определената посока slevanapravo след последователни операции [], а също така да промени работата приоритет * с скоби. Ако не сложи скоба, следното определение

разглежда като определението за двумерен масив от указатели към тип Int.

За гореописаните насоки са валидни следващата задача, тъй като ляво и дясно на заданието са указатели към един и същ тип данни:

р = А [0] [0]; р = A [2];

Това е неправилна, тъй отляво на оператора на задача се намира тип Int указател, и дясно - указател към първия елемент на масив, който (елемент) е масив от тип Int два елемента. В такива случаи, компилаторът издава предупреждение за подозрителен преобразуване показалка.

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

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

р [0] е еквивалентен на А [0] [0] р [1] е еквивалентен на А [0] [1]

р [2] е еквивалентен на А [1] [0] р [3] е еквивалентен на А [1] [1] р [4] е еквивалентно на [2] [0] р [5] е еквивалентно на [2] [1] р [ 6] е еквивалентен на А [3] [0] р [7] е еквивалентен на А [3] [1]

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

след което използването на масив А и показалеца pAstr напълно еквивалентен на:

pAstr [Ь] [й] е еквивалентен на А [Ь] [й]

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

pAstr [0] [0] е еквивалентно на [2] [0] pAstr [0] [1] е еквивалентно на [2] [1] pAstr [1] [0] е еквивалентен на А [3] [0] pAstr [1] [ 1] е еквивалентен на А [3] [1]

Следващите задачи са правилни

ра А; / * Указател към двумерен масив * / pAstr = Б; / * Указател към едномерен масив * /

и задайте следните договорени покупки:

(* PA) [Ь] [й] е еквивалентен на А [Ь] [й] (* pAstr) [I] е еквивалентно на Б [Ь]

Масиви указатели са удобни за съхранение на символни низове:

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

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