There is no such thing as a stupid question, until you ask it
+ еще один вопрос насчет строк.
У меня есть указатель на некую часть строки, указатель на другую часть строки. Как мне скопировать ту часть, что между ними? Что-то не могу даже определиться с алгоритмом.
+ Что вообще значит фраза "пользуясь указателями, определить адрес [определенных] символов"? Ведь указатель, ну, указывает на некую точку, с которой начинается считывание памяти. Если я какой-то левый указатель разыменую некой частью строки, то это все равно будет левый указатель со своими данными. К первоначальной строке он уже не будет иметь отношения. Или нет?
Короче, что справедливо, а или б?
читать дальше
Или можно добиться случая а, не используя разыменование, а присвоив указателю p адрес этой некой части? Но, опять же, как это можно сделать, если указатель, ну, указывает на некую точку, а не несколько ячеек памяти сразу.
У меня есть указатель на некую часть строки, указатель на другую часть строки. Как мне скопировать ту часть, что между ними? Что-то не могу даже определиться с алгоритмом.
+ Что вообще значит фраза "пользуясь указателями, определить адрес [определенных] символов"? Ведь указатель, ну, указывает на некую точку, с которой начинается считывание памяти. Если я какой-то левый указатель разыменую некой частью строки, то это все равно будет левый указатель со своими данными. К первоначальной строке он уже не будет иметь отношения. Или нет?
Короче, что справедливо, а или б?
читать дальше
Или можно добиться случая а, не используя разыменование, а присвоив указателю p адрес этой некой части? Но, опять же, как это можно сделать, если указатель, ну, указывает на некую точку, а не несколько ячеек памяти сразу.
Короче, что справедливо, а или б?
Ни то ни другое. Но 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 присвоится адрес следующей ячейки.
Это я понимаю. 4 ячейки в данном случае будут составлять диапазон значений указателя. Но втф как тогда понимать условие задачи?
Решить задачу можно например копируя символы до тех пор пока p не равен q.
Копируя куда? Если я буду просто менять p, сдвигая его на количество байт, кратное единице объявленного типа, то... ну, будет просто меняться р. Вот он дойдет до q, будут они равны, и что?
Если конкретнее, то мне нужен адрес символов, находящихся внутри скобок. Скажем, у меня указатель будет ссылаться на то, что сразу после открывающей скобки, второй указатель - на то, что перед закрывающей... но что делать дальше? Как может один указатель (ну ли один адрес) ссылаться на несколько мест одновременно? Или... тогда надо делать массив указателей, который...
Боги.
Приведите полностью формулировку задачи.
Пользуясь указателями, определить адрес символов, расположенных между 2й открывающейся и ближайшей закрывающейся скобками. //я легко нахожу оба адреса таких скобок, но что с ними делать...
я легко нахожу оба адреса таких скобок,
В таком случае у вас есть два указателя (две переменных) 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.
Можно например так решить.
Мне все-таки надо создать массив адресов на массив символов i.e. "слово" или "фразу" внутри скобок? Oh well.
Я просто в упор не понимала формулировку второй части задания, поскольку она дает мало конкретики и вообще выражается какими-то мутными понятиями.
Судя по второму заданию, получается алгоритм: обходить строку в цикле посимвольно. Если встретили '(', то писать в массив результатов ссылку на символ. Если встретили ')', то прекратить писать в массив результатов.
Если работа происходит не в куче, а строки хранятся в ввиде массива символов, то можно найти только адрес скобок, а затем инкрементировать сам указатель ибо массивы располагаются в памяти последовательно.
Ну хотя бы так, например:
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й открывающейся и ближайшей закрывающейся скобками. //я легко нахожу оба адреса таких скобок, но что с ними делать...
Судя из этого текста – создать массив, содержащий адреса символов внутри скобок.
Нет. Вам нужно создать массив символов, который будет хранить символы на которые указывает p.
а затем инкрементировать сам указатель
Bad practice по-моему. Массив конечно располагается последовательно, но терять начало куска я бы не стал.
Но это же учебная задача(?) на алгоритмы. В реальной жизни взял бы .substr() и .find_last_of(), например.
Мне нужны не сами символы, а их адреса. Так что мне нужен массив адресов как минимум. То есть,
Скептичный циник, создать массив, содержащий адреса символов внутри скобок.
+1
Нет?