Форум программистов, компьютерный форум CyberForum.ru

Указатель на строку - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.97
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 14:16     Указатель на строку #1
Скажите пожалуйста если есть
C++
1
2
string str="Big!";
       string *pt=&str;
, как можно обратиться к 'B' или '!' через pt, и возможно ли это вообще
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
07.08.2012, 14:18     Указатель на строку #2
C++
1
char c = (*pt)[0];
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 14:21     Указатель на строку #3
C++
1
2
3
4
5
6
7
8
9
int main()
{
    std::string ss("Big!");
    std::string *pt=&ss;
 
    std::cout << (*pt)[0] << " " << (*pt)[3] <<std::endl;
 
    return 0;
}
Миниатюры
Указатель на строку  
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 14:28  [ТС]     Указатель на строку #4
То есть это 2х мерный массив?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.08.2012, 14:45     Указатель на строку #5
Цитата Сообщение от Aliru777 Посмотреть сообщение
это 2х мерный массив?
Откуда вы это взяли
C++
1
2
3
4
string str="Big!";
string *pt=&str;
cout<<pt<<endl;  // выводит адрес на который указывает pt
cout<<*pt<<endl; // разименованный указатель, выводит обект на которий он указывает
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 19:19  [ТС]     Указатель на строку #6
Насколько я понимаю синтаксис (*указатель)[1] это тоже что и указатель[0][1] - что является 2мерным массивом - я просто пытаюсь разобраться
Вот я уже этим интересовался там вроде объяснили 2х мерные массивы
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 19:34     Указатель на строку #7
вот у вас есть память в ней записано Big!
[0]B
[1]i
[2]g
[3]!

ss = "Big!";
*pt = &ss;

*pt = Big!;
ss= Big!;

(*pt)[1] = B;
ss[1] = B;
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 20:34  [ТС]     Указатель на строку #8
Почитал здесь http://www.cyberforum.ru/blogs/18334/blog97.html, но:
pt-это указатель на адресс 0-го элемента или указатель на 1мерный массив
тогда (*pt) это что?указатель на массив?
и как тогда описать ss - что это?адресс 0 элемента массива?
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 20:41     Указатель на строку #9
Цитата Сообщение от Aliru777 Посмотреть сообщение
Почитал здесь http://www.cyberforum.ru/blogs/18334/blog97.html, но:
pt-это указатель на адресс 0-го элемента или указатель на 1мерный массив
тогда (*pt) это что?указатель на массив?
и как тогда описать ss - что это?адресс 0 элемента массива?
ладно вот вам массив ( а вообще строка - это и есть массив символов)

int ma= {1,2,3,4,5};

ma - указатель на 0 элемент
ma[3] - равнозначно ma+3 указатель на 3( 4 индексирование массива с 0) элемент

если 1 ячейка занимает 4 байта
то шаг ma+1 - указатель переходит на следующие 4 байта
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 21:10  [ТС]     Указатель на строку #10
Да не в этом вопрос.
Вопрос изначально в типе string
я понимаю о шагах указателя(и о том что не везде он будет 4 байта тоже кстати)
Вопрос в
C++
1
2
string str="Big!";
    string *pt=&str;
На что указывает в таком случае pt и *pt это ведь не одно и тоже?
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 21:14     Указатель на строку #11
Цитата Сообщение от Aliru777 Посмотреть сообщение
Да не в этом вопрос.
Вопрос изначально в типе string
я понимаю о шагах указателя(и о том что не везде он будет 4 байта тоже кстати)
Вопрос в
C++
1
2
string str="Big!";
    string *pt=&str;
На что указывает в таком случае pt и *pt это ведь не одно и тоже?
*pt - разыменование, получение значения находящегося в этой ячейке адреса
pt - сам адрес 0x435ab34 (например)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.08.2012, 21:26     Указатель на строку #12
Указатель - это переменная, в которой находится адрес. pt - это переменная (название переменной - указатель), в которой находится адрес объекта str. Знак * , стоящий перед переменной-указателем, означает операцию разыменования указателя. Если pt - это переменная, содержащая адрес str, то *pt - это то, что находится по этому адресу. В данном случае, сам объект str.

Добавлено через 11 минут
str - это не просто строка в стиле С, т.е. массив char c символом '\0' в конце. Это объект класса string, в данном случае, инициализированный строковым литералом "Big!". Сам строковый литерал хранится в статической памяти, а в объекте str хранится указатель на эту область памяти.
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 21:27  [ТС]     Указатель на строку #13
я так понимаю я не могу внятно объяснить что я пытаюсь понять
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;
    string str="Big!";
    string *pt=&str;
    char c = (*pt)[0];
    cout<<c;
    cout<<(&str)[1];
    cout<<pt[0][1];
    string str1[2]={"ABC", "DEF"};
    string *pt1=str1;
    cout<<pt1[1][2];
    getch();
    return 0;
}
мне интересно если *pt это сам объект(строка), то что такое
C++
1
pt[0][1];
C++
1
(*pt)[0]:
ведь если предположить что это реально объект, то что мы получаем разименовав объект еще раз?
C++
1
pt[0][1];
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.08.2012, 14:41     Указатель на строку #14
Цитата Сообщение от Aliru777 Посмотреть сообщение
то что мы получаем разименовав объект еще раз?
Что вы считаете разыменованием ещё раз? Вот это: *pt и это: pt[0], по сути, одно и тоже. То, что находится в памяти, адрес начала которой содержится в pt. Имя массива преобразуется в указатель на начало массива. pt[0] - cодержимое памяти, по адресу в pt, со смещением 0. Исходя из этого, становится понятным и это: (*pt)[0] , pt[0][0]. Одно и то же. Никаких двумерных массивов тут нет. pt[0] - сам объект str, а так как объект string допускает обращение по индексу к элементам строки, с которой этот объект связан, то pt[0][i] (где i - индекс) - это обращение к i - элементу строки.


C++
1
2
3
4
5
6
int a = 10;
int *p = &a;
cout << p << endl; // адрес переменной а.
cout << &(p[0]) << endl; //то же, что и предыдущая строка.
cout << *p << endl; //выводит 10.
cout << p[0] << endl; //то же, что и предыдущая строка.
C++
1
2
3
4
5
int p1[3] = {10, 20, 30};
cout << p1 << endl; //адрес начала массива.
cout << &(p1[0]) << endl; //то же, что и предыдущая строка.
cout << *p1 << endl; //выводит 10.
cout << p1[0] << endl; //то же, что и предыдущая строка.
C++
1
2
3
4
....................
string str="Big!";
.....................
cout<<(&str)[1]; // ошибка.
(&str)[0] - объект str. (&str)[1] - то что в памяти за объектом str (&str + смещение 1, равное размеру объекта). Так как объект string str занимает 32 байта, то (&str)[1] - содержимое памяти по адресу: &str + 32 байта.

Добавлено через 14 минут
В общем виде, можно так написать: если adr - адрес некого объекта, то adr[i] - содержимое памяти по этому адресу со смещением i, где i равно размеру объекта.
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
08.08.2012, 23:49  [ТС]     Указатель на строку #15
Про смещения я понимаю(хотя о 32 байтах в типе string не знал) - и вообще о указателях многое, вопрос скорее был о тои что хранит объект string - адресс строкового литерала в статической памяти.
Цитата Сообщение от alsav22 Посмотреть сообщение
В общем виде, можно так написать: если adr - адрес некого объекта, то adr[i] - содержимое памяти по этому адресу со смещением i, где i равно размеру объекта.
ну это уже совсем...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2012, 10:54     Указатель на строку
Еще ссылки по теме:

Указатель на строку C++
C++ Работа с строкой (указатель на строку)
Вернуть указатель на строку C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.08.2012, 10:54     Указатель на строку #16
Цитата Сообщение от Aliru777 Посмотреть сообщение
ведь если предположить что это реально объект, то что мы получаем разименовав объект еще раз?
C++
1
pt[0][1];
Я вот про это.

Добавлено через 10 часов 19 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Сам строковый литерал хранится в статической памяти, а в объекте str хранится указатель на эту область памяти.
Написал, и не правильно. Строковый литерал нельзя изменять, поэтому нет никакого смысла объекту string хранить указатель на него. Создаётся копия этого литерала в динамической памяти и указатель на эту копию хранится в объекте string. Через этот указатель и ведётся работа со строкой. Более подробно, о реализациях класса string (а они бывают разные), можете здесь почитать: http://cpp.com.ru/meyers/ch2.html (Совет 15. Помните о различиях в реализации string).
Yandex
Объявления
09.08.2012, 10:54     Указатель на строку
Ответ Создать тему
Опции темы

Текущее время: 12:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru