Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
1

Опят про указатели)

04.03.2010, 13:58. Просмотров 751. Ответов 11
Метки нет (Все метки)

C++
1
2
3
4
5
    int a = 5;
    int *b =&a;
    cout <<*b<<endl;
    *b++;
    cout <<*b<<endl;
В строке 4 что происходит?
По идее если * то мы работаем со значением => увеличиваем значение на 1
но эт не так. причем что с * что без * - результат один. Увеличивается адрес указателя на 1. почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2010, 13:58
Ответы с готовыми решениями:

Про указатели .
Всем привет: Продолжаю свою традицию: Вот придумал необычную задачку, может кому то она...

Про указатели
В среде C++ Builder разбираюсь с логикой работы с указателями. По определению (в моем его...

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

Про массивы и указатели
#include &lt;iostream&gt; using namespace std; int Digit = {...

11
Эксперт С++
5019 / 2598 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
04.03.2010, 14:00 2
C++
1
(*b)++
Увеличение значения, найди где - нибудь таблицу операций с указателями
0
324 / 308 / 68
Регистрация: 05.11.2009
Сообщений: 712
04.03.2010, 14:00 3
C++
1
2
3
4
5
int a = 5;
int *b =&a;
cout << *b <<endl;
(*b)++;
cout << *b <<endl;
в результате получается на экране 5 и 6

Цитата Сообщение от fasked Посмотреть сообщение
C++
1
*(b++)
это увеличение указателя на 1, а после получение значения

Цитата Сообщение от Krist_ALL Посмотреть сообщение
В строке 4 что происходит?
По идее если * то мы работаем со значением => увеличиваем значение на 1
но эт не так. причем что с * что без * - результат один. Увеличивается адрес указателя на 1. почему?
у операции ++ приоритет выше, чем у *
0
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
04.03.2010, 14:05 4
Чё гадать-то?
Нужно верить своим глазам. Если у тебя увеличивается указатель, значит *b++ увеличивает именно указатель. Если это трудно сразу понять, необходимо сделать пометку где-нибудь и к ней возвращаться.

На крайняк почитать у K&R, глава 5.1 "Указатели и адреса", цитата:

"(*ip)++
В последней записи скобки необходимы, поскольку без них инкременировался бы указатель ip, а не то, на что он указывает"

Хотя кнгига по С, но думаю в данном случае это неважно.
0
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 14:42 5
C++
1
2
3
int A = 5;
int* pA = &A;
++*pA;
Скобки неудобно ставить Но можно же так...
1
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
04.03.2010, 15:04  [ТС] 6
insideone, ты как всегда на высоте)

Следующий вопрос:

C++
1
2
3
4
    double *p3 = new double [3];
    p3[0] = 0.2;
    p3[1] = 0.5;
    p3[2] = 0.8;
почему p3[0] = 0.2; а не *p3[0] = 0.2;
0
324 / 308 / 68
Регистрация: 05.11.2009
Сообщений: 712
04.03.2010, 15:07 7
Цитата Сообщение от Krist_ALL Посмотреть сообщение
почему p3[0] = 0.2; а не *p3[0] = 0.2;
потому что p3[0] == *(p3)
p3[1] == *(p3 + 1)
p3[2] == *(p3 + 2)
PS а лучше всего взять книгу, и почитать её...
0
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 15:09 8
Когда обращаемся к указателю с индексом можно сказать мы обращаемся уже к переменной, т.е. пишем что то вроде этого
C++
1
*(p3+n); // p3[n];
Получается что
C++
1
p3 == &p3[0]
0
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
04.03.2010, 15:10 9
Потому, что операция разыменования применяется к указателям. То есть к сущности, содержащей в себе адрес.
*p3[0] = 0.2 нелепица, ибо разыменование применяется к p3[0]
А p3[0] не адрес. Это значение 0,2

Тебе про скобки понятно? Что-то мне не нравится это дело, какая-то недоговрённость. Вместо чего тебе предложено применять конструкцию ++*pA;
?
0
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 15:13 10
Цитата Сообщение от kravam Посмотреть сообщение
Вместо чего тебе предложено применять конструкцию ++*pA;
?
Вместо
C++
1
*(pA)++
В ситуациях когда пост\пре инкремент - не важно, так чисто для экономии скобок ) Если важно, то со скобками как указано выше...
0
быдлокодер
1719 / 906 / 106
Регистрация: 04.06.2008
Сообщений: 5,618
04.03.2010, 15:25 11
Ну так я и знал. Нутром чуял что что-то не то.
Значит, вот здесь скобки
*(pA)++

Не нужны АБСОЛЮТНО. Ну подумай сам, ты просто имя переменной заключил в скобки, ровным счётом ничего не даёт. Убираем их, получаем
*pA++

Эта конструкция и
++*pA

Ну никак эквивалентны быть не могут, при всём желании.В первом случае у тебя инкременируется УКАЗАТЕЛЬ, а во втором ЗНАЧЕНИЕ по указателю. (пост ли пре щас не рассматриваю даже)
0
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
04.03.2010, 15:29 12
Прошу прощения, конечно же
C++
1
(*pA)++; // A++
Т.е. инкрементирование значения на которое указывает pA
Кстати можно ещё так
C++
1
2
3
4
int A = 5;
int* pA = &A;
pA[0]++; // A++;
++pA[0]; // ++A;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2010, 15:29

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

Вопрос про указатели
#include &lt;iostream.h&gt; int main() { int x; int *Pointer; pointer = &amp;x; cout &lt;&lt; pointer; cout...

Вопрос про указатели
char *a = &quot;s&quot;; 1. Выделяется место в памяти 2. В это место записывается s 3. Указателю a...

Про указатели с использованием функции
Вопросы в комментариях к коду #include &lt;iostream&gt; #include &lt;cctype&gt; #include &lt;cstring&gt; using...

Вопрос про указатели на массивы
В книге написано int a; int *p; p = &amp;a; //У меня выдает ошибку p = &amp;a; //Так работает p...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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