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.
Если есть вопросы, то спрашивайте.