|
Накратко указтелят е променлива, която сочи адреса на даден обект в паметта.
Указателят се декларира по следният начин: CODE
Tип може да бъде всеки валиден C тип. След него се поставя знака "*", следван от името на указателя. Типът на указателя е много важен. Винаги, когато декларирате указател, трябва да го декларирате от типът на променливата, която той ще "сочи". По напред в урока ще разберете защо това е важно. Има два важни оператора свързани с указателите. Операторът & и операторът *. Операторът & връща адреса на променливата стояща след него. Операторът * връща стойноста съдържаща се на адреса, който указателят сочи. CODE
Нека да разгледаме кода по-подрбоно. На първия ред се декларира указател от цяло число и променлива цяло число, която се инициализира със стойност 10. След това на указателят p се присвоява адреса на i. Или по друг начин казано p сочи i. Това се нарича индиректност. На третият ред се отпечатва стойноста на i посредством оператора "*" следван от името на указателя. Също така можете да присвоявате стойност на променливата сочена от указателя. CODE
Когато операторът "*" бъде приложен в лявата част на конструкцията за присвояване се присвоява стойност на променливата сочена от указателя индиректно. Сега да видим защо типът на указателят е толкова важен. Да кажем, че имаме един указател от тип int и една променлива i от тип int. CODE
При това индиректно присвояване компилатор знае, че трябва да копира 4 байта в i(при 4 байтов int). Но какво ще стане примерно, ако указателят е декларарин с тип double и се опитаме да присвоим double стойност на i? Компилаторът знае, че трябва да копира 8 байта(при 8 байтов double), но i е 4 байта. Той ще копира 4 байта в задалената памет за i, но другите 4 байта ще се изгубят. Това ще предизвика грешка. Затова винаги когато декларирате указател го декларирайте от типа на променливата/те, които ще сочи. Неможете да използвате указател преди той да съдържа адреса на някой обект в паметта. Освен двата оператора & и * има още четири аритметични опеатора, които могат да се използват с указателите. Те са ++ -- - +. Не можете да прибавяте дробна стойност на указател или да изваждате. Можете да прибавяте и изваждате само целочислени стойности. Указателна аритметика не е като обикновенната. Тя се извършва в зависимост от типа на указателя. Да кажем, че p е указател от тип int(4 байтов) и съдържа адрес 100 в паметта. Като се приложи оператора за инкрементиране ++. CODE
p вече ще съдържа адрес 104. CODE
Сега p ще съдържа адрес 204. Неможете да прилагате никакви други аритметични операции освен събиране и изваждане. Указатели и масиви Масив без индекс всъщност е указател към началото на масива. Примерно: CODE
Така много лесно можете да достигнете до всеки един елемент от масива. Защо се получава така? Ами понеже масив без индекс всъщност е указател към началото на масива... *p отпечатва 1, *(p+1) отпечатва 2 защото към p прибавяме 1 т.е p вече сочи към следващият елемент. Ако началото на масива се намира на адрес 100 то следващият елемент ще се намира на адрес 101, следващият на 102 и т.н. Можете да създавате и масиви от указатели. Това става по същият начин както при всички типове променливи. Този код създава масив от указатели от тип char с 5 елемента. CODE
Така записвате адреса на i в 2 елемент. CODE
Така можете да присвоите стоност на i. CODE
Указатели и низови константи Когато компилаторът срещне низ той го съхранява в низова таблица на програмата и създава указател към него. Така можете да декларирате указател сочещ низова константа. CODE
Компилаторът връша адреса на низа "some text" в низовата таблица на указателя. Така лесно можете да отпечатате низа сочен от указателя посредством някой функция за изход. Примерно puts(). Нейният аргумент е char указател. CODE
Тка можете да създадете низова таблица с указател. CODE
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









