Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42

Не могу понять разницу в написании

08.02.2016, 16:39. Показов 1475. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, это равнозначные записи? И в чем вообще смысл варианта 1?

C++ (Qt)
1
2
3
4
5
int a[5];
 
1. int * const &b=a;
 
2. int * const b=a;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2016, 16:39
Ответы с готовыми решениями:

Не могу понять разницу
Здравствуйте! Помогите, пожалуйста, понять разницу в коде: int b = 5; int a(float(b)); cout << a << endl; ...

Не могу понять разницу! do-while
Цикл for работает: #include <iostream> #include <math.h> #include <conio.h> using namespace std; int main() { char...

Стек на основе массива структур - эт как понять читаю литературу и не могу понять!
Стек статически (на основе массива структур). Пример структура "Товар" которая включает в себя: № по каталогу(ключ), Название, цена, срок...

19
7 / 7 / 3
Регистрация: 19.03.2010
Сообщений: 182
08.02.2016, 17:12
Ну... в обоих случаях ты получаешь адрес первого элемента массива а.
0
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
08.02.2016, 17:17  [ТС]
Да, но какой смысл ставить & ?
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 17:39
Могу ошибаться, но по моему будет так.
1) b - константная сcылка на указатель (более правильно говорить ссылка на константный указатель). Подробнее в моей теме: Почему говорят "константная ссылка"?
2) b - константный указатель

Добавлено через 6 минут
Цитата Сообщение от viktimolog Посмотреть сообщение
Да, но какой смысл ставить & ?
Встречный вопрос.
C++
1
2
3
int a = 10;
const int &b = a;
const int c = a;
Какой смысл ставить &? Думаю на свой вопрос вы найдете ответ сами.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2016, 18:19
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от vab9petryk Посмотреть сообщение
Какой смысл ставить &?
В данном случае ситуация немного другая.
Цитата Сообщение от viktimolog Посмотреть сообщение
И в чем вообще смысл варианта 1?
C++
1
2
3
int * const &b=a;//Будет создан временный объект - указатель. Этот объект будет привязан к ссылке.
int * const b=a;//Будет создан временный объект - указатель. Этот объект копируется в b.
//всё это без учета любых оптимизаций и допущений.
0
30 / 4 / 0
Регистрация: 13.04.2010
Сообщений: 42
08.02.2016, 18:30  [ТС]
Да, теоретически всё понятно. Непонятно только в чем практическое отличие. Синтаксис использования одинаковый. Зачем вообще тут вводить ссылку? В чем может быть выигрыш или разница хотя бы?
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 18:33
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
int * const &b=a;//Будет создан временный объект - указатель. Этот объект будет привязан к ссылке.
В принципе согласен.
То есть, в случаи
C++
1
2
int a = 10;
const int &b = a;
также будет создан временный объект
C++
1
const int _a = 10;
который и будет присвоен
C++
1
const int &b = _a
?

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
int * const b=a;//Будет создан временный объект - указатель. Этот объект копируется в b.
Тут не согласен, зачем создавать временный объект? Это же не указатель на константу.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2016, 18:37
Цитата Сообщение от vab9petryk Посмотреть сообщение
который и будет присвоен
'a' - не временный объект.
Будет создана ссылка на 'a'.
А вот так будет:
C++
1
2
    int a = 10;
    const double &b = a;//будет создан временный объект, который привяжется к ссылке
Добавлено через 56 секунд
Цитата Сообщение от vab9petryk Посмотреть сообщение
Тут не согласен, зачем создавать временный объект
Потому что массив - это не указатель.
Значит будет неявный каст массива к указателю,
а значит создан временный объект.
Опять же, это всё без "вырезаний" лишнего.
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 18:43
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что массив - это не указатель.
массив - не указатель. Это понятно. Но ведь переменная a - это указатель, который указывает на первый элемент массива a[].
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2016, 18:48
Цитата Сообщение от vab9petryk Посмотреть сообщение
Но ведь переменная a - это указатель, который указывает на первый элемент массива a[].
Ну так сначала нужно привести массив к типу указатель.
То бишь:
C++
1
2
int * b=static_cast<int*>(a);//Явный каст. Каст даст временный объект - указатель.
int * b=a;//Неявный каст. Каст даст временный объект - указатель.
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 19:04
Цитата Сообщение от viktimolog Посмотреть сообщение
Да, теоретически всё понятно. Непонятно только в чем практическое отличие. Синтаксис использования одинаковый. Зачем вообще тут вводить ссылку? В чем может быть выигрыш или разница хотя бы?
Почитайте в чем отличия ссылочной переменной от простой переменной, или ссылочной переменной от переменной указателя, и тогда поймете в чем выигрыш.

Добавлено через 12 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну так сначала нужно привести массив к типу указатель.
И каким образом массив, который не является типом данных, а скорей структурой, привести к типу данных? В данном случаи Вы приводите не массив к указателю, а указатель к указателю. Массив привести вы ни к чему не сможете. a - это уже переменная-указатель, которая указывает на первый элемент массива.
По поводу static_cast (из википедии):
Оператор static_cast может использоваться для следующих преобразований:
- приведение указателя базового класса к указателю производного класса (без проверок типа во время выполнения);
- преобразование численного типа enums в int или int в float и наоборот;
- преобразования с изменением разрядности (например, из int в char) и с изменением знака (например, из signed short int в unsigned int);
- явный вызов метода класса, выполняющего преобразование класса к значению нужного типа.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2016, 19:06
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от vab9petryk Посмотреть сообщение
Массив привести вы ни к чему не сможете.
Для Вас из стандарта:
4.2 Array-to-pointer conversion
1. An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.
a - это уже переменная-указатель
a - это массив.
Массив != указатель.
Цитата Сообщение от vab9petryk Посмотреть сообщение
а указатель к указателю
я показал пример, как бы это выглядело в случае явного каста.
Да, здесь было нужно использовать reinterpret_cast
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 19:50
Цитата Сообщение от Croessmah Посмотреть сообщение
4.2 Array-to-pointer conversion
1. An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.
хмм... и откуда вы такой умный? В какой книге такое описано, кроме как в стандарте?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.02.2016, 19:55
Цитата Сообщение от vab9petryk Посмотреть сообщение
В какой книге такое описано, кроме как в стандарте?
Разве какая-то книга может быть правдивее стандарта?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от vab9petryk Посмотреть сообщение
хмм... и откуда вы такой умный?
Из Инзы.

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2016, 20:27

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Из Инзы.
Истина :good::friends:


Цитата Сообщение от vab9petryk Посмотреть сообщение
В какой книге такое описано, кроме как в стандарте?
Ой, да вроде как в целой куче
0
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 21:02
Цитата Сообщение от Croessmah Посмотреть сообщение
Ой, да вроде как в целой куче
ну если в целой куче, тогда не составит труда назвать хотя бы одну из них
0
08.02.2016, 21:05

Не по теме:

Цитата Сообщение от vab9petryk Посмотреть сообщение
ну если в целой куче, тогда не составит труда назвать хотя бы одну из них
Это был сарказм. Ни в одной книге вы не найдёте всего того, что есть в стандарте.

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
08.02.2016, 21:26
Цитата Сообщение от vab9petryk Посмотреть сообщение
ну если в целой куче, тогда не составит труда назвать хотя бы одну из них
Можно подумать, что я должен помнить наизусть содержание всех книг

просмотрел парочку книг.
Один только Лафоре пишет,
что массив является указателем.
Другие, увиливают от прямого ответа,
и пишут невнятно, двусмысленно
Но вот, например, Стивен Дьюхерст пишет в книге "C++. Священные знания":
Главный сюрприз для новичка в C/C++ – отсутствие типа «массив» как формального параметра функции, потому что массив передается как ука затель на его первый элемент.
C++
1
2
3
4
5
6
void average( int ary[12] );
//...
int anArray[] = { 1, 2, 3 };
const int anArraySize =
    sizeof(anArray)/sizeof(anArray[0]);
average( anArray );
Для автоматического перехода от массива к указателю придуман очаровательный термин – разложение (decay). Массив разлагается до указателя на его первый элемент.
Достаточно?
Просто просматривать кучу документов у меня нет никакого желания.
Уж извините
1
 Аватар для vab9petryk
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
08.02.2016, 23:51
Цитата Сообщение от Croessmah Посмотреть сообщение
Один только Лафоре пишет,
что массив является указателем.
Другие, увиливают от прямого ответа,
и пишут невнятно, двусмысленно
Вот в этом то и беда, что в стандарте пишут одно, а в книгах пишут другое.
И не только Лафоре так пишет. Я читаю Дейтела. В книге ясно написано, что имя массива - константный указатель. Герберт Шилдт в книге С++. Базовый курс пишет: "использование имени массива без индекса генерирует указатель на первый элемент этого массива". Это уже хоть что то ближе к правде.

По моему, отличный пример (нашел у того же Дейтела):
C++
1
2
3
4
    int b[10];
    int *ptr = b;
    cout << sizeof(b) << '\n';
    cout << sizeof(ptr) << '\n';
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
08.02.2016, 23:58
Цитата Сообщение от vab9petryk Посмотреть сообщение
Вот в этом то и беда, что в стандарте пишут одно, а в книгах пишут другое.
Будьте выше этого. Проверяйте написанное в книге в стандарте.
Чем раньше начнете, тем быстрее избавитесь от фатальных заблуждений, вроде того, что массив
Цитата Сообщение от vab9petryk Посмотреть сообщение
не является типом данных
В книгах для начинающих зачастую сильно упрощают. Иногда в ущерб правде.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2016, 23:58
Помогаю со студенческими работами здесь

Не могу сделать полиморфизм. Не могу до конца понять пример по этому поводу
Есть такая задача: Класс Animal должен быть абстрактным, имеет имя и вес. Класс Reptile имеет habitate, который держит в себе среду...

Не могу понять почему не могу считать символьный ряд через cin.getline
Не могу понять почему не могу считать символьный ряд через cin.getline.Помогите позязя. #define _CRT_SECURE_NO_WARNINGS #include...

Не могу понять в чем косяк в написании натурального логарифма
Здравствуйте, перевожу формулу в 1с, он не рассчитывает ответ где я могла допустить ошибку? ...

Формализация предикатов. Не могу понять разницу между выражениями
1. Существует не менее одного предмета, удовлетворяющего P(x); 2.Существует не более одного предмета, удовлетворяющего P(x); ...

Не могу понять саму суть использования MVC при написании программы
Изучаю паттерн MVC. Прочитал уже много чего, но не очень доходит до меня как использовать MVC при написании самой программы. Нашел...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru