Форум » C/C++ для начинающих (C/C++ for beginners) » Строковый литерал и указатель на строку. В чем разница??? » Ответить

Строковый литерал и указатель на строку. В чем разница???

Solyanko : Добрый день. Начал только изучать С++, не могу понять в чем разница между указателем на литерал и указателем на строку??? Заранее благодарен.

Ответов - 6

Сыроежка: Solyanko пишет: Начал только изучать С++, не могу понять в чем разница между указателем на литерал и указателем на строку??? Что вы понимаете под указателем на строку? Строковый литерал в С++ имеет тип const char[] . При использовании имени масстива в выражениях он преобразуется в указатель на первый элемент массива. Например, const char *p = "A string literal"; В С в отличии от С++ строковый литерал имеет тип char[], то есть квалификатор const отсутствует. Тем не менее ни в С, ни в С++ вы не можете изменять строковый литерал в том смысле, что результатом будет неопределенное поведение программы. Так как в С у типа строкового литерала отсутствует квалификатор const, то для совместимости с С в С++ также разрешается указывать указатель на строковый литерал без квалификатора const. Например, char *p = "A string literal"; Если я вас правильно понял, то под указателем на строку вы имеете в виду указатель на символьный массив. Допустим есть определение массива char s[] = "A string literal"; И вы хотите адрес этого массива присвоить некоторому указателю следующим образом p = &s; Для этого вам этот указателеь надо определить как char ( *p )[sizeof( s )]; Или вместо sizeof( s ) вы можете использовать числовую константу, если вам известен размер массива. В данном случае размер массива равен длине литерала "A string literal", то есть количеству символов, заключенных в двойные кавычки плюс завершаюший нулевой символ. Это будет равно 17. В чем отличии объявления char *p; от объявления char ( *p )[17]; ? Например, при увеличении указателя на 1 посредством p + 1 или ++p результирующее выражение, которое также будет указателем будет указывать на следующий элемент того типа, который является базовым при определении указателя. Так для первого объявления ++p увеличится на 1, так как sizeof( char ) равно 1. Во втором случае ++p увеличится на 17, так как базовым типом указателя является массив из 17 элементов, то есть sizeof( char[17] ) равно 17. Если есть вопросы, то спрашивайте.

Сыроежка: Дополню для ясности, что вы также можете написать char s[] = "A string literal"; char *p = s; Но в этом случае p это указатель на char, а не указатель на массив, то есть на char ( * )[sizeof( s )]

Solyanko: Сыроежка пишет: Что вы понимаете под указателем на строку? Строковый литерал в С++ имеет тип const char[] . При использовании имени масстива в выражениях он преобразуется в указатель на первый элемент массива. ..... Спасибо огромное за обширный ответ Сыроежка пишет: char ( *p )[17]; Да не знал что есть указатели на массив, знал что есть указатель на первый элемент массива. Я так понял это и есть понятие указателя на строку??


Сыроежка: Solyanko пишет: Я так понял это и есть понятие указателя на строку?? Это такое "ненаучное" высказывание, что трудно судить, какой смысл в эту фразу вкладывает ее автор. Я думаю, что скорей всего имеется в виду именно указатель на первый элемент массива, если под строкой понимать символьный массив. Ведь, как я уже написал, при использовании имени массива в выражениях, или при передачи в качестве аргумента функции, оно преобразуется в указатель на первый элемент массива. Поэхтому, например, следующие объявления функций эквивалентны, то есть объявляют одну и ту же функцию void f( char s[10] ); void f( char s[20] ); void f( char s[] ); void f( char *s ); И в них нельзя передавать массив, который допустим объявлен как char s[15]; в виде выражения f( &s ); Нужно писать f( s ); Тогда аргумент, то есть имя массива, будет преобразован в указатель на первый элемент этого массива.

Solyanko: Ок. Спасибо, понял.

Solyanko: Побольше бы таких объяснений на форумах



полная версия страницы