Показалки и символни низове
Низ константа, записано като
е масив от знаци. Вътрешно представяне на масива завършва с нулев знак '\ 0'. чрез които програмата може да намерите в края на линията. Броят на клетките на паметта на един повече от броя на знаците, поставени между двойни кавички.
В повечето случаи, константите на низ се използват като аргументи на функции, като например, например, в
Когато такъв низ герой се появява в програмата, достъпът до него е чрез указател характер; т.е. ФОРМАТ получава указател към началото на поредица от знаци. По-конкретно, достъп до низ постоянно чрез указател към първия елемент.
String константи не се нуждаят само като аргументи на функции. Ако, например, pmessage променлива декларирана като
pmessage = "сега е времето";
сложите в него указател към характер масива, низът не се копира, копира само указател към нея. Дейностите, които ще работят с линията като не са предвидени единица в С.
Има една важна разлика между следните определения:
въглен amessage [] = "сега е времето"; / * Array * /
Чар * pmessage = "сега е времето"; / * Index * /
amessage - масив с размери, така че той просто се вписва посочената последователност от символи и '\ 0'. Отделните знаци в масива могат да се променят, но amessage винаги сочи към едно и също място на паметта. За разлика pmessage указател, инициализира с указване на последователност постоянна. стойността на индекса може да се промени, и то последните ще се насочи към нещо друго. Също така, ако се опитате да променя съдържанието на константите, резултатът е неопределен.
Допълнителни аспекти, свързани с указатели и масиви, илюстрират няколко модифицирани версии на две полезни програми, които взехме от стандартната библиотека. Първият от тях, strcpy функция (S, T). т копия низ в низ и. Бих искал да напише чат S = т. но копия на оператора показалеца, не героите. За да копирате героите, ние трябва да се повтаря. Първи пример strcpy, като се използва масив, има следния вид:
/ * Strcpy: копие т и в един ред;
вариант с множество * /
невалидни strcpy (овъгляване и [], знак т [])
а ((S [Ь] = т [Ь])! = '\ 0')
За сравнение версия на strcpy с указатели:
/ * Strcpy: копие т и в един ред;
невалидни strcpy (знак * S, знак * т)
Тъй като функцията само копия на предадените стойности на аргументите, strcpy могат да използват свободно на параметрите S и Т двете местните променливи. Те са за работа правилно указатели, които се движат всеки път към следващия знак във всяка една от масиви за толкова дълго, колкото копирани низ тон не е '\ 0'.
На практика strcpy не пиша. Един опитен програмист биха предпочели по-кратък запис:
/ * Strcpy: копие т и в един ред;
Вариант 2 показалка * /
невалидни strcpy (знак * S, знак * т)
Нарастването на S и Т се извършва в контролната част от цикъла. Стойността на * т ++ е знака, който показва променлива т преди стойността му се увеличава; Postfix ++ не променя показалеца т. докато не бъдат извадени характер, за които се посочва. Въпреки това, по отношение на S. първо характер ще бъде запомнен в позицията, посочи от старата стойност на с. и едва след това стойността на S се увеличава. Нападатели символ е както на стойност, която се сравнява с '\ 0'. В крайна сметка, всички герои са копирани, включително крайния '\ 0'.
Забелязвайки, че сравнението с '\ 0' не е необходимо (както в C различна от нула стойност на израза в състоянието се лекува и как тя е истината), можем да направим още един и последен програма за намаляване на текста:
/ * Strcpy: копие т и в един ред;
Вариант 3 показалка * /
невалидни strcpy (знак * S, знак * т)
Въпреки, че на пръв поглед, че сме получили, изглежда загадъчна, но толкова по-удобно влизане, и трябва да го овладее, както и в програми за C често ще се срещне с нея.
Що се отнася до strcpy в стандартната библиотека
Втората програма, която смятаме, че тук е strcmp (S, T). Той сравнява кодовите конци S и Т и връща отрицателно, нула или положителна стойност, съответно, ако редицата е лексикографски по-малко от, равно или по-голямо от т низ. Резултатът се получава чрез изваждане на първата несравнимо символ на S и т.
/ * Strcmp: резултати <0 при s > 0, когато е> т * / Int strcmp (овъгляване и [], знак т []) за (I = 0; и [Ь] == т [Ь]; и ++)Свързани статии