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

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

08.02.2016, 16:39. Показов 1450. Ответов 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru