Показалки в програмирането, devprog блог за програмисти
На тази сутрин, аз избута, че в учебниците по програмиране не се дава достатъчно внимание на една толкова важна тема като указатели. Това означава, че вниманието е разбира се изплаща, но на принципа на обучение за работа с указатели или не разбират, или дори по-лошо, ни най-ясно. По този начин, в различни форуми и конференции, посветени на програмирането на всеки три нови програмист иска да му помогне да се справят с тази тема. Тази кратка статия ще се опита да запълни тази празнина. Всички примери са в различни програмни езици - така че всичко е ясно, без значение какъв език се учи. Аз също се предположи, че сте запознати с най-малко една от трите езика - е Паскал \ Delphi, C ++ и Assembler.
Както знаете, всеки вид има променлива размер. Например, един вид число - процесор разпределя 2 байта на паметта, както и типа на байт - 1 байт. Под longint - DWORD - т.е. "двойна дума", която е 4 байта. Така че, WORD - това е 2 байта, или "дума". Например, един байт - два номера от 00 до FF (в шестнадесетичен). За всеки тип данни - размерът му в паметта (което един, може да се намери в референтната Language).
Това е, както знаете, ако се вгледате в нашата маса, и ако ние се опише променлива - указател към цяло число тип, а след това ще отнеме точно 2 байта памет и нашата маса, която е с памет, ще имат следния вид:
Защо указатели се използва?
Както знаете, на процедурите за разговори и функции в езиците за програмиране, както следва:
# іnclude <іostrеam.h>
INT maіn (междинно argc, знак * argv [])
знак * lpString; // обяви променлива, указател към овъгляване
Чар String [] = "Нашата нова линия"; // обяви масив (стринг)
Cout < Cout < връщане 0; // Край на програмата Между другото, за да се вземе стойността директно от клетката - с помощта на операция указател сочен от конзоли под формата на символа "*" пред променливата. Cout < Cout <<*lpString < Това ще получите на изхода само един герой - "H". Ето няколко примера на други езици: започвам програмни test1; Между другото, забележете как Нося низ: програмни test1; Pointer_String: lpStr; vString: String; ClrScr; Pointer_String: = @vString; writeln (Pointer_String ^); Тук изрично се определят видовете индекси. Ето, например, lpStr - указател към низ, и така нататък. И когато става дума за вземане на адрес указател, ние не сме свободни да се уточни какво се отнася до нашия индекс. Е, в крайна сметка, разгледаме един пример на асемблер с помощта на компилатора широко разпространена - MASM32. Аз няма да дам всичко от кода, но показва само най-важното: String db, 00 «низ събрание!»; Ние заяви масив с нулев байт в края натиснете компенсира String; постави в стека променлива String изместване натиснете 0; повикване кутия Брой дд 00h; Както можете да видите, асемблер дръжки такива конструкции е много лесно. Показалки - низове един чудесен инструмент Ние ще се разработи програма, която ще бъде заменена в линията на всички символи "*" в празнините и да отпечатате резултатите за конзолата. Вариант на C: # іnclude <іostrеam.h> voіd основен () lpCharString = szText [0]; за (размер = lstrlen (lpCharString) ;! размер = 0; размер-, lpCharString ++) ако (* lpCharString == '*') * lpCharString = 0x20; Cout <<*lpCharString; Var за Counter: = 1 до iSize-2 направя Както можете да видите, също всичко е удобен и интуитивен. Но едно нещо, което има всичко - и въпреки това да обясни. Виж, където в цикъла I точка -2 общата дължина? Така че, струни формат Delphi е, че точно преди линията ще бъде поле от тип WORD и полето съдържа дължината на низа. Тя изглежда така: И тъй като те не се нуждаят от нас, ние просто ги изваждате. Въпреки, че ако не се вземат - всичко ще работи, разбира се. Но аз просто ви показва какъв формат струни Delphi. Що се отнася до останалото, всичко в тази програма е напълно идентичен с този, програмиран в C. Паскал неща.
Това означава, че ако ние вместо низ:
MessageBox (0, lpString, String1,0); // покаже прозорец с текста, но от различни източници
край.
Var ул: низ;
lpStr: указател;
започвам
lpStr: = @ ул;
ул: "Паскал показалеца! =;
writeln (низ (lpStr ^));
readln;
разпорежда (lpStr);
lpStr: = нула;
край.
използва CRT;
тип
lpStr = ^ низ;
lpInt = ^ число;
lpReal = ^ реален;
Pointer_Integer: lpInt;
Pointer_Real: lpReal;
vInteger: цяло число;
vReal: Real;
vString: = "Къде е моето показалка? ';
vInteger: = 100;
vReal: = 456.3000;
Pointer_Integer: = @vInteger;
Pointer_Real: = @vReal;
writeln (Pointer_Integer ^);
writeln (Pointer_Real ^);
...
... тук миете признаци ...
...
поп [lpString]; Ние извадете го от купа и се слага в lpString
натиснете [lpString]; гр насоки за това ред
натиснете [lpString]
натиснете HWND_DESKTOP
lpString дд 00h;
низ db «Hello Wordl», 00
Е, нещо като указатели, подредени. Сега ние се определи всичко на едно удобно на маса, и ще продължи да работи с указатели.
# іnclude
знак * lpCharString;
овъгляване szText [] = »1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0";
Int А;
Int размер;
>
>
szStr: масив [0..20] овъгляване;
lpStr: ^ Чар;
iSize: цяло число;
Брояч: Integer;
започвам
szStr: = '1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 0 ";
lpStr: = @szStr;
iSize: = дължина (szStr);
започвам
ако lpStr ^ = "*" след това да започне
lpStr ^: = "";
приключи;
напиши (lpStr ^);
Inc (lpStr);
приключи;
readln;
край.