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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 60, средняя оценка - 4.97
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
#1

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

07.08.2012, 14:16. Просмотров 9083. Ответов 15
Метки нет (Все метки)

Скажите пожалуйста если есть
C++
1
2
string str="Big!";
       string *pt=&str;
, как можно обратиться к 'B' или '!' через pt, и возможно ли это вообще
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2012, 14:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на строку (C++):

Указатель на строку: как выводить не всю строку целиком, а конкретную букву - C++
Есть программка: #include<iostream> using namespace std; void fn_str1(int i,string str1,char *p) { p=&str1; ...

Разработать и испытать функцию, которая переворачивает строку и возвращает указатель на перевёрнутую строку - C++
Разработать и испытать функцию, которая переворачивает строку и возвращает указатель на перевёрнутую строку. Прототип функции инверсии...

Указатель на строку - C++
Доброго времени суток. У меня вопрос по поводу *char К примеру у меня есть функция void get(char *s1) { s1="hello"; } ...

Указатель на строку - C++
Хочу считать строку какой угодно длины, ограниченной разве памятью компа.Затем надо получить указатель на эту строку, чтоб работать, как...

Как получить ссылку на указатель или указатель на указатель в массиве? - C++
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Вернуть указатель на строку - C++
Найти в массиве вторую строку, содержащую хотя бы один ноль. Вернуть указатель на эту строку, вывести ее на экран.

15
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
07.08.2012, 14:18 #2
C++
1
char c = (*pt)[0];
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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;
}
1
Миниатюры
Указатель на строку  
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 14:28  [ТС] #4
То есть это 2х мерный массив?
0
DiffEreD
1430 / 767 / 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; // разименованный указатель, выводит обект на которий он указывает
0
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 19:19  [ТС] #6
Насколько я понимаю синтаксис (*указатель)[1] это тоже что и указатель[0][1] - что является 2мерным массивом - я просто пытаюсь разобраться
Вот я уже этим интересовался там вроде объяснили 2х мерные массивы
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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;
0
Aliru777
1 / 1 / 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 элемента массива?
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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 байта
0
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.08.2012, 21:10  [ТС] #10
Да не в этом вопрос.
Вопрос изначально в типе string
я понимаю о шагах указателя(и о том что не везде он будет 4 байта тоже кстати)
Вопрос в
C++
1
2
string str="Big!";
    string *pt=&str;
На что указывает в таком случае pt и *pt это ведь не одно и тоже?
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 21:14 #11
Цитата Сообщение от Aliru777 Посмотреть сообщение
Да не в этом вопрос.
Вопрос изначально в типе string
я понимаю о шагах указателя(и о том что не везде он будет 4 байта тоже кстати)
Вопрос в
C++
1
2
string str="Big!";
    string *pt=&str;
На что указывает в таком случае pt и *pt это ведь не одно и тоже?
*pt - разыменование, получение значения находящегося в этой ячейке адреса
pt - сам адрес 0x435ab34 (например)
0
alsav22
5421 / 4816 / 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 хранится указатель на эту область памяти.
1
Aliru777
1 / 1 / 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];
0
alsav22
5421 / 4816 / 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 равно размеру объекта.
1
Aliru777
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
08.08.2012, 23:49  [ТС] #15
Про смещения я понимаю(хотя о 32 байтах в типе string не знал) - и вообще о указателях многое, вопрос скорее был о тои что хранит объект string - адресс строкового литерала в статической памяти.
Цитата Сообщение от alsav22 Посмотреть сообщение
В общем виде, можно так написать: если adr - адрес некого объекта, то adr[i] - содержимое памяти по этому адресу со смещением i, где i равно размеру объекта.
ну это уже совсем...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2012, 23:49
Привет! Вот еще темы с ответами:

Указатель на строку массива - C++
Попалось на глаза задание: Написать функцию get_arr, которая предназначена для заполнения значениями двумерных массивов произвольной...

Массив и указатель на строку - C++
class Frabjous { private: char fab; public: Frabjous(const char *s=&quot;C++&quot;):fab(s) {} ... }

указатель на строку типа Integer - C++
Необходимо в тэг компонента записать указатель на строку. Можно ли задать указатель на строку типа Integer напрямую? я делал так ...

Работа с строкой (указатель на строку) - C++
Написал такую программку которая будет в будущем подсчитывать количество продуктов, цены на отдельные продукты и цены общие.. с самого...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
08.08.2012, 23:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru