Показалки в програмирането, devprog блог за програмисти

На тази сутрин, аз избута, че в учебниците по програмиране не се дава достатъчно внимание на една толкова важна тема като указатели. Това означава, че вниманието е разбира се изплаща, но на принципа на обучение за работа с указатели или не разбират, или дори по-лошо, ни най-ясно. По този начин, в различни форуми и конференции, посветени на програмирането на всеки три нови програмист иска да му помогне да се справят с тази тема. Тази кратка статия ще се опита да запълни тази празнина. Всички примери са в различни програмни езици - така че всичко е ясно, без значение какъв език се учи. Аз също се предположи, че сте запознати с най-малко една от трите езика - е Паскал \ Delphi, C ++ и Assembler.


Както знаете, всеки вид има променлива размер. Например, един вид число - процесор разпределя 2 байта на паметта, както и типа на байт - 1 байт. Под longint - DWORD - т.е. "двойна дума", която е 4 байта. Така че, WORD - това е 2 байта, или "дума". Например, един байт - два номера от 00 до FF (в шестнадесетичен). За всеки тип данни - размерът му в паметта (което един, може да се намери в референтната Language).

Това е, както знаете, ако се вгледате в нашата маса, и ако ние се опише променлива - указател към цяло число тип, а след това ще отнеме точно 2 байта памет и нашата маса, която е с памет, ще имат следния вид:

Показалки в програмирането, devprog блог за програмисти

Защо указатели се използва?

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

# іnclude <іostrеam.h>
INT maіn (междинно argc, знак * argv [])

знак * lpString; // обяви променлива, указател към овъгляване

Чар String [] = "Нашата нова линия"; // обяви масив (стринг)

Cout <

Cout <

връщане 0; // Край на програмата

Между другото, за да се вземе стойността директно от клетката - с помощта на операция указател сочен от конзоли под формата на символа "*" пред променливата.
Това означава, че ако ние вместо низ:

Cout <

Cout <<*lpString <

Това ще получите на изхода само един герой - "H".

Ето няколко примера на други езици:

започвам
MessageBox (0, lpString, String1,0); // покаже прозорец с текста, но от различни източници
край.

програмни test1;
Var ул: низ;
lpStr: указател;
започвам
lpStr: = @ ул;
ул: "Паскал показалеца! =;
writeln (низ (lpStr ^));
readln;
разпорежда (lpStr);
lpStr: = нула;
край.

Между другото, забележете как Нося низ:

програмни test1;
използва CRT;
тип
lpStr = ^ низ;
lpInt = ^ число;
lpReal = ^ реален;

Pointer_String: lpStr;
Pointer_Integer: lpInt;
Pointer_Real: lpReal;

vString: String;
vInteger: цяло число;
vReal: Real;

ClrScr;
vString: = "Къде е моето показалка? ';
vInteger: = 100;
vReal: = 456.3000;

Pointer_String: = @vString;
Pointer_Integer: = @vInteger;
Pointer_Real: = @vReal;

writeln (Pointer_String ^);
writeln (Pointer_Integer ^);
writeln (Pointer_Real ^);
...
... тук миете признаци ...
...

Тук изрично се определят видовете индекси. Ето, например, lpStr - указател към низ, и така нататък. И когато става дума за вземане на адрес указател, ние не сме свободни да се уточни какво се отнася до нашия индекс.

Е, в крайна сметка, разгледаме един пример на асемблер с помощта на компилатора широко разпространена - MASM32. Аз няма да дам всичко от кода, но показва само най-важното:

String db, 00 «низ събрание!»; Ние заяви масив с нулев байт в края

натиснете компенсира String; постави в стека променлива String изместване
поп [lpString]; Ние извадете го от купа и се слага в lpString

натиснете 0; повикване кутия
натиснете [lpString]; гр насоки за това ред
натиснете [lpString]
натиснете HWND_DESKTOP

Брой дд 00h;
lpString дд 00h;
низ db «Hello Wordl», 00

Както можете да видите, асемблер дръжки такива конструкции е много лесно.
Е, нещо като указатели, подредени. Сега ние се определи всичко на едно удобно на маса, и ще продължи да работи с указатели.

Показалки в програмирането, devprog блог за програмисти

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

Ние ще се разработи програма, която ще бъде заменена в линията на всички символи "*" в празнините и да отпечатате резултатите за конзолата. Вариант на C:

# іnclude <іostrеam.h>
# іnclude

voіd основен ()
знак * lpCharString;
овъгляване szText [] = »1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0";
Int А;

lpCharString = szText [0];
Int размер;

за (размер = lstrlen (lpCharString) ;! размер = 0; размер-, lpCharString ++)

ако (* lpCharString == '*') * lpCharString = 0x20; Cout <<*lpCharString;
>
>

Var
szStr: масив [0..20] овъгляване;
lpStr: ^ Чар;
iSize: цяло число;
Брояч: Integer;
започвам
szStr: = '1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0 ";
lpStr: = @szStr;
iSize: = дължина (szStr);

за Counter: = 1 до iSize-2 направя
започвам
ако lpStr ^ = "*" след това да започне
lpStr ^: = "";
приключи;
напиши (lpStr ^);
Inc (lpStr);
приключи;
readln;
край.

Както можете да видите, също всичко е удобен и интуитивен. Но едно нещо, което има всичко - и въпреки това да обясни. Виж, където в цикъла I точка -2 общата дължина? Така че, струни формат Delphi е, че точно преди линията ще бъде поле от тип WORD и полето съдържа дължината на низа. Тя изглежда така:

Показалки в програмирането, devprog блог за програмисти

И тъй като те не се нуждаят от нас, ние просто ги изваждате. Въпреки, че ако не се вземат - всичко ще работи, разбира се. Но аз просто ви показва какъв формат струни Delphi. Що се отнася до останалото, всичко в тази програма е напълно идентичен с този, програмиран в C. Паскал неща.