0 / 0 / 0
Регистрация: 10.01.2009
Сообщений: 4
|
|
1 | |
Задача с указателями10.01.2009, 23:15. Показов 2693. Ответов 21
Метки нет Все метки)
(
Здравствуйте. У меня проблема: никак не могу понять эти указатели
![]() Спасибо.
0
|
|
10.01.2009, 23:15 | |
Ответы с готовыми решениями:
21
задача с Указателями Работа с указателями Не получается с указателями :( Путаница с указателями |
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
10.01.2009, 23:34 | 2 |
char a[n];
a[i] == *(a+i)
0
|
0 / 0 / 0
Регистрация: 10.01.2009
Сообщений: 4
|
|
11.01.2009, 00:19 [ТС] | 3 |
а если чуть-чуть конкретней пожалуйста?
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
11.01.2009, 00:39 | 4 |
в памяти ячейки идут подряд одна за другой равны одному байту, поэтому и адресы их отличаются на еденицу, если у тебя тип int (и равен 4) то и два рядом стоящих int'а будут отличаться на 4 байта (шаг будет равен 1 а адресы отличаются на 4, шаг будет 2 а адресы отличаются на 8 )
0
|
0 / 0 / 0
Регистрация: 10.01.2009
Сообщений: 4
|
|
11.01.2009, 10:04 [ТС] | 5 |
Это ясно. Дело в том, что я не могу понять сам алгоритм: как убрать два(или один) центральных символа двигая сам указатель, а не индекс отдельных букв.
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
11.01.2009, 10:20 | 6 |
чего тут понимать двигаешь указатель к первому элементу, который нужно убрать и записываешь в него i+2 элемент
char *p = &c[0]; p = p + strlen(c)>>1 - 1 - strlen(c)&1; p тогда будет указывать на первый удаляемый элемент. ну а дальше по четности
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
11.01.2009, 12:07 | 7 | |||||
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
11.01.2009, 13:08 | 8 |
при чем тут приоритет?
они работают быстро
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
11.01.2009, 13:54 | 10 |
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
11.01.2009, 15:45 | 12 |
см. вложение
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
11.01.2009, 16:24 | 13 |
Код
(1-strlen(c)&1); сначала strlen возвращает значение, потом оно из еденицы вычитается, а потом побитовое умножение происходит, потому что сдвиги идут после + -, а & | вообще после сравнений == != идут Код
p = p + (strlen(c)>>1)-(1-strlen(c)&1); Код
p = p + (strlen(c) >> 1) - 1 - (strlen(c) & 1);
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
11.01.2009, 16:45 | 14 |
в файле который прикреплен все нормально работает
зы: честно говоря мне уже надоело. те чего надо?
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
11.01.2009, 17:00 | 16 |
твой файл я исправил (и имя и объявление strlen и scanf читает теперь правильно, и по теме у тебя мало того что там ошибка, мало того что ты не понимаешь в чём там ошибка, так даже если её исправить всё неправильно работает)
ты вообще внимательно прочитал что я тебе написал по поводу скобок ? если от еденицы отнимается длина строки, а потом полученное отрицательное число побитово умножается на еденицу, получится младший бит отрицательного числа, если у тебя там что-то правильно - это просто совпадение и не более допустим длина строки равна 5, 1-5 = -4, это 1111100 (еденицы налево идут до края типа), получится количество символов чётное, ты понял или нет ?
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
11.01.2009, 22:23 | 17 |
это называется переливание из пустого в порожнее или по-другому занудство.
все выше сказанное можно было уложить в одно сообщение при этом никакого отношения к теме вся эта чепуха не имеет Добавлено через 4 часа 38 минут 45 секунд и не важно что получается отрицательное число (это еще как посмотреть), так как после 1-strlen(c) следует &1 все биты кроме 0го не важны и это будет эквивалентно x%2 ? 1 : 0, что правильно а вот 1+(strlen(c)&1) будет давать 2 при strlen = 1, что неправильно
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
12.01.2009, 02:57 | 18 |
задание abc - вырезать b abcd - вырезать bc p, который установлен на a в обоих случаях при добавлении половины в первом случае оказывается на b, а во втором случае оказывается на c; в обоих случаях мы шагаем влево (в первом перейдёт на a во втором перейдёт на b), а потом шагаем вправо на значение этого бита чётности (в первом случае он равен еденице, во втором случае он равен нулю), т.е. в первом случае он шагает влево и вправо, а во втором случае только влево (таким образом получается правильная установка для обоих случаев на b) твой код я запускал, на тебе ещё пример Код
#include <stdio.h> main() { int a = 1; if (a << 1 == 2) printf("yes a = %d\n", a); return 0; } Добавлено через 2 часа 36 минут 27 секунд я понял, они обе правильные только работают по разному и ошибка у них наступает при нуле (указатель с начала строки смещается влево) Код
p += (strlen(c) >> 1) - 1 + (strlen(c) & 1); p += (strlen(c) >> 1) - (1 - strlen(c) & 1);
0
|
Флудер
195 / 33 / 11
Регистрация: 23.03.2007
Сообщений: 334
|
|
12.01.2009, 04:43 | 19 |
Еще после твоего второго сообщения я понял в чем была ошибка. обычно я не задумываюсь про приоритеты, а обильно пичкаю скобками
зы: этот пример - сравнение выполняется раньше сдвига
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
12.01.2009, 08:31 | 20 |
Код
#include <stdio.h> main() { if (2 & 2 > 1) printf("yes\n"); return 0; }
0
|
12.01.2009, 08:31 | |
Помогаю со студенческими работами здесь
20
непонятки с указателями Проблема с указателями! Работа с указателями Контейнер с указателями на... Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |