There is no such thing as a stupid question, until you ask it
+ еще один вопрос насчет строк.
У меня есть указатель на некую часть строки, указатель на другую часть строки. Как мне скопировать ту часть, что между ними? Что-то не могу даже определиться с алгоритмом.

+ Что вообще значит фраза "пользуясь указателями, определить адрес [определенных] символов"? Ведь указатель, ну, указывает на некую точку, с которой начинается считывание памяти. Если я какой-то левый указатель разыменую некой частью строки, то это все равно будет левый указатель со своими данными. К первоначальной строке он уже не будет иметь отношения. Или нет?
Короче, что справедливо, а или б?
читать дальше

Или можно добиться случая а, не используя разыменование, а присвоив указателю p адрес этой некой части? Но, опять же, как это можно сделать, если указатель, ну, указывает на некую точку, а не несколько ячеек памяти сразу.

@темы: Вопрос, C++, Алгоритм, C#

Комментарии
20.03.2014 в 19:24

Don't stop the music.
GippoRex,
Короче, что справедливо, а или б?
Ни то ни другое. Но a ближе к истине.

Указатель - это переменная хранящая адрес.
Как и у любой переменной - у указателя есть значение. Значение переменной - есть адрес ячейки памяти.
Содержать "адрес 4-х ячеек" указатель не может. Он может (например) содержать адрес 1-й ячейки из этих четырех.

Пример:
Определим указатель на тип char:
char* p;
p = 12;

Значение p - это 12. 12 - адрес ячейки.
Применяя оператор разыменования (dereference operator) получаем *p где *p - значение находящееся в ячейке, адрес которой 12.

Ещё пример:
Определим переменную типа char:
char x;

Теперь определим переменную, значение которой - адрес x. То есть определим указатель:
char* px;

Дадим px адрес x:
px = &x;

Так работают указатели.

В вашей задаче вам дан указатель p на начало части строки и указатель q на начало другой части.
Решить задачу можно например копируя символы до тех пор пока p не равен q. То есть сначала копируете *p, потом сдвигаете p = p + 1 и так далее.
Согласно арифметике указателей в p присвоится адрес следующей ячейки.
20.03.2014 в 19:39

There is no such thing as a stupid question, until you ask it
Слушатель, Содержать "адрес 4-х ячеек" указатель не может. Он может (например) содержать адрес 1-й ячейки из этих четырех.
Это я понимаю. 4 ячейки в данном случае будут составлять диапазон значений указателя. Но втф как тогда понимать условие задачи?
Решить задачу можно например копируя символы до тех пор пока p не равен q.
Копируя куда? Если я буду просто менять p, сдвигая его на количество байт, кратное единице объявленного типа, то... ну, будет просто меняться р. Вот он дойдет до q, будут они равны, и что?
Если конкретнее, то мне нужен адрес символов, находящихся внутри скобок. Скажем, у меня указатель будет ссылаться на то, что сразу после открывающей скобки, второй указатель - на то, что перед закрывающей... но что делать дальше? Как может один указатель (ну ли один адрес) ссылаться на несколько мест одновременно? Или... тогда надо делать массив указателей, который...
Боги.
20.03.2014 в 19:45

Don't stop the music.
GippoRex,
Приведите полностью формулировку задачи.
20.03.2014 в 19:48

There is no such thing as a stupid question, until you ask it
Проверить правильность расположения в тексте круглых скобок (количество открывающихся и закрывающихся скобок должно совпадать). //сделано
Пользуясь указателями, определить адрес символов, расположенных между 2й открывающейся и ближайшей закрывающейся скобками. //я легко нахожу оба адреса таких скобок, но что с ними делать...
20.03.2014 в 20:01

Don't stop the music.
GippoRex,
я легко нахожу оба адреса таких скобок,
В таком случае у вас есть два указателя (две переменных) p, q типа char*.
Значение переменной p - адрес первой '('
Значение переменной q - адрес первой ')'.

Допустим у вас есть массив copy нужной длины.
Тогда присваиваете p[i] в copy[i]. А индекс i бежит от 0 до q-p (включительно).

Обратите внимание, что согласно арифметике указателей p[i] = *(p + i) то есть обращение начнётся с адреса p.
Длина части q-p+1, значит индекс последней буквы - (q-p + 1) - 1 = q-p.

Можно например так решить.
20.03.2014 в 20:07

There is no such thing as a stupid question, until you ask it
Слушатель, тооо ееесть
Мне все-таки надо создать массив адресов на массив символов i.e. "слово" или "фразу" внутри скобок? Oh well.
Я просто в упор не понимала формулировку второй части задания, поскольку она дает мало конкретики и вообще выражается какими-то мутными понятиями.
20.03.2014 в 20:55

Миру - мир. А Вам - пломбир!
Омг (о.0)

Судя по второму заданию, получается алгоритм: обходить строку в цикле посимвольно. Если встретили '(', то писать в массив результатов ссылку на символ. Если встретили ')', то прекратить писать в массив результатов.

Если работа происходит не в куче, а строки хранятся в ввиде массива символов, то можно найти только адрес скобок, а затем инкрементировать сам указатель ибо массивы располагаются в памяти последовательно.

Ну хотя бы так, например:

int main()
{
char str[] = "foo(bar)baz";
int len = sizeof(str)/sizeof(char);
bool flag = false;
for (int i=0; i<len-1; ++i) {
cout << str[i];
if (str[i] == '(') { flag = true; }
if (flag) { cout << " –> " < (void*)&str[i]; }
if (str[i] == ')') { flag = false; }
cout << endl;
}
}


> Пользуясь указателями, определить адрес символов, расположенных между 2й открывающейся и ближайшей закрывающейся скобками. //я легко нахожу оба адреса таких скобок, но что с ними делать...
Судя из этого текста – создать массив, содержащий адреса символов внутри скобок.
20.03.2014 в 20:55

Don't stop the music.
Мне все-таки надо создать массив адресов
Нет. Вам нужно создать массив символов, который будет хранить символы на которые указывает p.
20.03.2014 в 21:00

Don't stop the music.
Скептичный циник,
а затем инкрементировать сам указатель
Bad practice по-моему. Массив конечно располагается последовательно, но терять начало куска я бы не стал.
20.03.2014 в 21:12

Миру - мир. А Вам - пломбир!
Слушатель, то, что это bad practice, если под рукой есть итераторы – абсолютно поддерживаю. Да и небезопасно при работе в куче.
Но это же учебная задача(?) на алгоритмы. В реальной жизни взял бы .substr() и .find_last_of(), например.
20.03.2014 в 21:34

There is no such thing as a stupid question, until you ask it
Слушатель, создать массив символов, который будет хранить символы
Мне нужны не сами символы, а их адреса. Так что мне нужен массив адресов как минимум. То есть,
Скептичный циник, создать массив, содержащий адреса символов внутри скобок.
+1

Нет?