Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
04.03.2010, 13:58     Опят про указатели) #1
C++
1
2
3
4
5
    int a = 5;
    int *b =&a;
    cout <<*b<<endl;
    *b++;
    cout <<*b<<endl;
В строке 4 что происходит?
По идее если * то мы работаем со значением => увеличиваем значение на 1
но эт не так. причем что с * что без * - результат один. Увеличивается адрес указателя на 1. почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2010, 13:58     Опят про указатели)
Посмотрите здесь:

Вопрос про указатели C++
C++ Вопрос про указатели
Вопрос про указатели на массивы C++
Про указатели . C++
Про указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.03.2010, 14:00     Опят про указатели) #2
C++
1
(*b)++
Увеличение значения, найди где - нибудь таблицу операций с указателями
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
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. почему?
у операции ++ приоритет выше, чем у *
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
04.03.2010, 14:05     Опят про указатели) #4
Чё гадать-то?
Нужно верить своим глазам. Если у тебя увеличивается указатель, значит *b++ увеличивает именно указатель. Если это трудно сразу понять, необходимо сделать пометку где-нибудь и к ней возвращаться.

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

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

Хотя кнгига по С, но думаю в данном случае это неважно.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
04.03.2010, 14:42     Опят про указатели) #5
C++
1
2
3
int A = 5;
int* pA = &A;
++*pA;
Скобки неудобно ставить Но можно же так...
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 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;
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
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 а лучше всего взять книгу, и почитать её...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
04.03.2010, 15:09     Опят про указатели) #8
Когда обращаемся к указателю с индексом можно сказать мы обращаемся уже к переменной, т.е. пишем что то вроде этого
C++
1
*(p3+n); // p3[n];
Получается что
C++
1
p3 == &p3[0]
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
04.03.2010, 15:10     Опят про указатели) #9
Потому, что операция разыменования применяется к указателям. То есть к сущности, содержащей в себе адрес.
*p3[0] = 0.2 нелепица, ибо разыменование применяется к p3[0]
А p3[0] не адрес. Это значение 0,2

Тебе про скобки понятно? Что-то мне не нравится это дело, какая-то недоговрённость. Вместо чего тебе предложено применять конструкцию ++*pA;
?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
04.03.2010, 15:13     Опят про указатели) #10
Цитата Сообщение от kravam Посмотреть сообщение
Вместо чего тебе предложено применять конструкцию ++*pA;
?
Вместо
C++
1
*(pA)++
В ситуациях когда пост\пре инкремент - не важно, так чисто для экономии скобок ) Если важно, то со скобками как указано выше...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
04.03.2010, 15:25     Опят про указатели) #11
Ну так я и знал. Нутром чуял что что-то не то.
Значит, вот здесь скобки
*(pA)++

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

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

Ну никак эквивалентны быть не могут, при всём желании.В первом случае у тебя инкременируется УКАЗАТЕЛЬ, а во втором ЗНАЧЕНИЕ по указателю. (пост ли пре щас не рассматриваю даже)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2010, 15:29     Опят про указатели)
Еще ссылки по теме:

C++ Про указатели с использованием функции
Пояснить про указатели и ссылки C++
Про указатели C++

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

Или воспользуйтесь поиском по форуму:
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
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;
Yandex
Объявления
04.03.2010, 15:29     Опят про указатели)
Ответ Создать тему
Опции темы

Текущее время: 03:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru