On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 14:31. Заголовок: Строковый литерал и указатель на строку. В чем разница???


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

Спасибо: 0 
Цитата Ответить
Ответов - 6 [только новые]





ссылка на сообщение  Отправлено: 28.07.12 14:32. Заголовок: Solyanko пишет: Нач..


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.

Если есть вопросы, то спрашивайте.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 14:34. Заголовок: Дополню для ясности,..


Дополню для ясности, что вы также можете написать

char s[] = "A string literal";

char *p = s;


Но в этом случае p это указатель на char, а не указатель на массив, то есть на char ( * )[sizeof( s )]

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 14:35. Заголовок: Сыроежка пишет: Чт..


Сыроежка пишет:

 цитата:

Что вы понимаете под указателем на строку?
Строковый литерал в С++ имеет тип const char[] . При использовании имени масстива в выражениях он преобразуется в указатель на первый элемент массива.
.....



Спасибо огромное за обширный ответ
Сыроежка пишет:

 цитата:
char ( *p )[17];


Да не знал что есть указатели на массив, знал что есть указатель на первый элемент массива.
Я так понял это и есть понятие указателя на строку??

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 14:36. Заголовок: Solyanko пишет: Я т..


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 );

Тогда аргумент, то есть имя массива, будет преобразован в указатель на первый элемент этого массива.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 14:38. Заголовок: Ок. Спасибо, понял. ..


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

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 14:38. Заголовок: Побольше бы таких об..


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

Спасибо: 0 
Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 19
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет