There is no such thing as a stupid question, until you ask it
+ еще один вопрос насчет строк.
У меня есть указатель на некую часть строки, указатель на другую часть строки. Как мне скопировать ту часть, что между ними? Что-то не могу даже определиться с алгоритмом.
+ Что вообще значит фраза "пользуясь указателями, определить адрес [определенных] символов"? Ведь указатель, ну, указывает на некую точку, с которой начинается считывание памяти. Если я какой-то левый указатель разыменую некой частью строки, то это все равно будет левый указатель со своими данными. К первоначальной строке он уже не будет иметь отношения. Или нет?
Короче, что справедливо, а или б?
читать дальше
Или можно добиться случая а, не используя разыменование, а присвоив указателю p адрес этой некой части? Но, опять же, как это можно сделать, если указатель, ну, указывает на некую точку, а не несколько ячеек памяти сразу.
У меня есть указатель на некую часть строки, указатель на другую часть строки. Как мне скопировать ту часть, что между ними? Что-то не могу даже определиться с алгоритмом.
+ Что вообще значит фраза "пользуясь указателями, определить адрес [определенных] символов"? Ведь указатель, ну, указывает на некую точку, с которой начинается считывание памяти. Если я какой-то левый указатель разыменую некой частью строки, то это все равно будет левый указатель со своими данными. К первоначальной строке он уже не будет иметь отношения. Или нет?
Короче, что справедливо, а или б?
читать дальше
Или можно добиться случая а, не используя разыменование, а присвоив указателю p адрес этой некой части? Но, опять же, как это можно сделать, если указатель, ну, указывает на некую точку, а не несколько ячеек памяти сразу.

-
-
20.03.2014 в 19:24Короче, что справедливо, а или б?
Ни то ни другое. Но 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Это я понимаю. 4 ячейки в данном случае будут составлять диапазон значений указателя. Но втф как тогда понимать условие задачи?
Решить задачу можно например копируя символы до тех пор пока p не равен q.
Копируя куда? Если я буду просто менять p, сдвигая его на количество байт, кратное единице объявленного типа, то... ну, будет просто меняться р. Вот он дойдет до q, будут они равны, и что?
Если конкретнее, то мне нужен адрес символов, находящихся внутри скобок. Скажем, у меня указатель будет ссылаться на то, что сразу после открывающей скобки, второй указатель - на то, что перед закрывающей... но что делать дальше? Как может один указатель (ну ли один адрес) ссылаться на несколько мест одновременно? Или... тогда надо делать массив указателей, который...
Боги.
-
-
20.03.2014 в 19:45Приведите полностью формулировку задачи.
-
-
20.03.2014 в 19:48Пользуясь указателями, определить адрес символов, расположенных между 2й открывающейся и ближайшей закрывающейся скобками. //я легко нахожу оба адреса таких скобок, но что с ними делать...
-
-
20.03.2014 в 20:01я легко нахожу оба адреса таких скобок,
В таком случае у вас есть два указателя (две переменных) 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Мне все-таки надо создать массив адресов на массив символов i.e. "слово" или "фразу" внутри скобок? Oh well.
Я просто в упор не понимала формулировку второй части задания, поскольку она дает мало конкретики и вообще выражается какими-то мутными понятиями.
-
-
20.03.2014 в 20:55Судя по второму заданию, получается алгоритм: обходить строку в цикле посимвольно. Если встретили '(', то писать в массив результатов ссылку на символ. Если встретили ')', то прекратить писать в массив результатов.
Если работа происходит не в куче, а строки хранятся в ввиде массива символов, то можно найти только адрес скобок, а затем инкрементировать сам указатель ибо массивы располагаются в памяти последовательно.
Ну хотя бы так, например:
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Нет. Вам нужно создать массив символов, который будет хранить символы на которые указывает p.
-
-
20.03.2014 в 21:00а затем инкрементировать сам указатель
Bad practice по-моему. Массив конечно располагается последовательно, но терять начало куска я бы не стал.
-
-
20.03.2014 в 21:12Но это же учебная задача(?) на алгоритмы. В реальной жизни взял бы .substr() и .find_last_of(), например.
-
-
20.03.2014 в 21:34Мне нужны не сами символы, а их адреса. Так что мне нужен массив адресов как минимум. То есть,
Скептичный циник, создать массив, содержащий адреса символов внутри скобок.
+1
Нет?