Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433

Почему при присваивании адреса массива не ставится знак '&' получения адреса

22.11.2015, 21:01. Показов 7585. Ответов 88
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    int a[2] = { 2, 3 };
    int* b;
    b = a; //Почему при присваивании адреса массива не ставится знак '&' получения адреса.
//А когда присваиваешь адрес отдельной переменной, то необходимо ставить этот знак.
//int a=2;
    int* b;
    b = &a;//
}
И ещё адрес массива из пяти элементов передаст указателю все пять элементов? От адреса первого [0] до адреса последнего [4]. То есть, после такого присвоения указатель будет иметь все 5 адресов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2015, 21:01
Ответы с готовыми решениями:

Операция получения адреса & и vector
Здравствуйте. Работает ли Операция получения адреса (&) в векторе? Просто есть пример в книги, но про вектор ничего не сказано....

1. Ввести символьный массив. Найти адреса всех парных его элементов. 2. Вывести адреса элементов массива 4 на 4, находящ
Помогите пж... 1. Ввести символьный массив. Найти адреса всех парных его элементов. 2. Вывести адреса элементов массива 4 на 4,...

Почему разные адреса одного и того же элемента динамического массива?
Я создаю динамический массив и отправляю его в функцию, если потом сравнивать адреса элементов массива в главной и вызываемой функции они...

88
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.11.2015, 13:42
Студворк — интернет-сервис помощи студентам
Это не упрощение. В русском варианте цитаты Дейтелов грубая ошибка.
Имя массива - не является ни указателем, ни ссылкой, ни чем-либо еще. Это вообще не объект какого бы-то ни было типа, это идентификатор типа NoType и стандарт разрешает это "чудо-юдо" приводить к типу константный указатель.
Только благодаря неявному приведению, с ним возможно работать как с константным указателем.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
23.11.2015, 13:58
Блин, про неявное приведение к указателю чё-то никто не пишет. Вот, ещё, например в "Эффективное программирование на C++":
Цитата Сообщение от Эндрю Кёниг и Барбара Му
Независимо от того, как мы определим массив, всегда существует следующее
фундаментальное соотношение между массивами и указателями: всякий раз когда мы
используем имя массива как значение, это имя представляет собой указатель на начальный
элемент массива (первое фундаментальное свойство массивов).
Добавлено через 5 минут
И далее (стр. 212) там же:
Цитата Сообщение от Эндрю Кёниг и Барбара Му
Как упоминалось в разделе 10.1.3, имя массива является адресом начального элемента этого массива.
0
23.11.2015, 14:00

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
Блин, про неявное приведение к указателю чё-то никто не пишет
Вредный кот дал же цитату из стандарта. Неужто кредит доверия оригиналу библии С++ меньше чем кредит доверия русским переводам из разных источников, которые не стандарт языка???

на крайняк, можно в отладчике посмотреть (нужно только уметь отладчиком пользоваться)

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
23.11.2015, 14:06
Цитата Сообщение от daslex Посмотреть сообщение
Неужто кредит доверия оригиналу библии С++ меньше чем кредит доверия русским переводам из разных источников, которые не стандарт языка???
Да нет, не меньше, конечно. Просто почти все учебники во весь голос одно и то же кричат. Странно как-то.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
23.11.2015, 14:08
Цитата Сообщение от daslex Посмотреть сообщение
Это вообще не объект какого бы-то ни было типа, это идентификатор типа NoType и стандарт разрешает это "чудо-юдо" приводить к типу константный указатель
Ого, это что-то новенькое
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.11.2015, 14:20
Цитата Сообщение от gru74ik Посмотреть сообщение
Просто почти все учебники во весь голос одно и то же кричат. Странно как-то.
Ничего странного. Просто учебник пишется более понятным языком, а не сухим языком Стандарта.
Именно поэтому, учить язык по Стандарту - занятие не благодарное, но и утверждать, что книги врут тоже нельзя, т.к. с обывательской (прикладного программиста) точки зрения имя массива есть указатель на начальный элемент.
А вот когда хочется узнать как (почему) это работает уже есть смысл заглянуть в Стандарт.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
23.11.2015, 14:21
Вот ещё и Липпман сотоварищи в "Язык программирования C++. Базовый курс" (2014) туда же (стр. 167):
Цитата Сообщение от Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му
Существует множество свидетельств того факта, что операции с массивами зачастую являются операциями с указателями. Одно из них - при использовании массива как инициализатора переменной, определённой с использованием спецификатора auto (см. раздел 2.5.2, стр.107), выводится тип указателя, а не массива.
C++
1
2
int ia[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // ia - массив из 10 целых чисел
auto ia2(ia); // ia2 - это int*, указывающий на первый элемент в ia
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
23.11.2015, 15:03
Посмотрел русский, не ленись посмотреть оригинальный текст в оригинальном учебнике.
Вот я не поленился. Отрыл оригинал Дейтелов (7изд). Красиво там все, красочно так.

оригинал текста
Arrays and pointers are intimately related in C++ and may be used almost interchangeably.
An array name can be thought of as a constant pointer
Перевод текста
Массивы и указатели тесно связаны в C ++ и могут использоваться как синонимы.
Имя массива можно рассматривать в качестве константного указателя
Заметь, что ни разу не сказано о том, что это указатель. В оригиналах других популярных книг наверняка так же. Это твердолобые переводчики косячят не по-детски. А мы страдаем.

Добавлено через 4 минуты
А дальше уже пример, что они тесно связаны.

C++
1
2
int b[ 5 ]; // create 5-element int array b
int *bPtr; // create int pointer bPtr
Добавлено через 2 минуты
Хотя дальше и говорится...
Because the array name (without a subscript) is a (constant) pointer to the first element of the array, we can set bPtr to the address of the first element in array b with the statement
ошибочно в оригинале

Добавлено через 11 минут
Дейтелы немного подофигели такую ересь писать
Although array names are pointers to the beginning of the array, array names cannot be
modified in arithmetic expressions, because array names are constant pointers.
Это однозначно ошибка авторов. Они как бы и рассматривают их как указатели, только не оговорили этого явно. Вот только в этом у них тут ошибка.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
24.11.2015, 06:31
daslex, я думаю, это общее место в большинстве обучающих книг по С++. Упрощение. Да, они грешат против истины, но так проще объяснить новичку. Они говорят о том, что это указатель, но не упоминают о том, что получается он из неявного преобразования имени массива в указатель на первый элемент. Иначе придётся ещё тут же пояснять, что такое преобразования, чем явные преобразования отличаются от неявных и т.д. А в теме про массивы и указатели новичку и так непросто разобраться.

Добавлено через 10 минут
У Страуструпа так:
Цитата Сообщение от Bjarne Stroustrup
In C++, pointers and arrays are closely related. The name of an array can be used as a pointer to its initial element. For example:
C++
1
2
intv[] = {1, 2, 3, 4};
int* p1 = v; // pointer to initial element (implicit conversion)
Цитата Сообщение от Бьярне Страуструп
В языке C++ указатели и массивы тесно связаны. Имя массива может быть использовано в качестве указателя на его первый элемент. Например:
C++
1
2
intv[] = {1, 2, 3, 4};
int* p1 = v; //указатель на начальный элемент (неявное преобразование)
Добавлено через 7 минут
И далее у него же:
Цитата Сообщение от Bjarne Stroustrup
The implicit conversion of an array name to a pointer to the initial element of the array is extensively used in function calls in C-style code.
Цитата Сообщение от Бьярне Страуструп
Неявные преобразования имени массива в указатель на его первый элемент широко используются при вызовах функций в С-стиле.
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 08:55
Всё, что неявно куда-то приводится является этим куда-то.
Метафорически говоря, типовая метка указателя int* -- базовый тип для типа переменной а, объявленной как int a[5];
0
24.11.2015, 09:00

Не по теме:

Класная опечатка!

Цитата Сообщение от Байт Посмотреть сообщение
для хренения

0
24.11.2015, 09:49

Не по теме:

Цитата Сообщение от zss Посмотреть сообщение
Класная опечатка!
Долго думал. Показал жене. На семейном совете решили - так и оставить:) Спасибо, что заметили:good:

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.11.2015, 09:51
mporro, да ладно?
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
24.11.2015, 09:54
Есть ли для программиста разница - является ли имя массива указателем или приводится оно к указателю?
При передаче в качестве параметра это одно и то же. А когда это не одно и то же, есть примеры?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
24.11.2015, 10:06
Цитата Сообщение от zer0mail Посмотреть сообщение
А когда это не одно и то же
далеко ходить не надо. sizeof.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.11.2015, 10:08
zer0mail, ну сделай две функции, одна принимает массив, другая - указатель и посмотри, если ли разница. Ах, да, sizeof тоже не забудь.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 10:31
Croessmah
Так как в любом выражении, где требуется переменная int*, можно использовать переменную int a[], то очевидно, что массив -- это указатель. Хотя указатель -- это не массив, так как можно написать выражение верное для int a[5], но неверное для int*.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.11.2015, 11:08
Цитата Сообщение от mporro Посмотреть сообщение
где требуется переменная int*, можно использовать переменную int a[]
очевиден неявный каст.
Ну и там, где требуется размер указателя, получим размер массива.
Например, литерал 0 имеет тип int, но может быть неявно преобразован к указателю, но это не делает из этого литерала указательный тип.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 17:10
Цитата Сообщение от Croessmah Посмотреть сообщение
это не делает из этого литерала указательный тип
Никто не запрещает одному объекту принадлежать разным типам. Неявное преобразование ноля в указатель говорит о том, что 0 -- это и целое число, и указатель.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.11.2015, 17:16
Цитата Сообщение от mporro Посмотреть сообщение
Никто не запрещает одному объекту принадлежать разным типам.
У объекта один тип.
Цитата Сообщение от mporro Посмотреть сообщение
Неявное преобразование ноля в указатель говорит о том, что 0 -- это и целое число, и указатель.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo(int)
{
}
 
void foo(int*)
{
}
 
int main()
{
    foo(0) ;
}
Никаких конфликтов, потому что 0 - int
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2015, 17:16
Помогаю со студенческими работами здесь

Почему адреса элементов массива находятся в памяти не по порядку
Приветствую! Подскажите пожалуйста почему адреса элементов массива находятся в памяти не по порядку? почему и где происходит изменение...

Ошибка получения ip-адреса
Всем доброго времени суток) Возникла проблема, вот, собственно она: имеется стационарник с прямым подключением к интернету, к нему через...

Определить тип получения IP-адреса
Доброго дня. Подскажите пожалуйста: Необходимо определить, получен ли ip адрес по DHCP или прописан вручную. Надо парсить вывод команды...

Почему при редактировании ip-адреса NetworkManager создаёт второе соединение?
На Ubuntu Sevrer 16.04 LTS поставил NetworkManager. Включил его. Перезагрузил. Отредактировал ip-адрес. Перезагрузил. Смотрю, две...

Получения адреса объекта вызвавшего события
Всем доброго дня уважаемые форумчане. Ситуация в следующим, во время выполнения программы динамически создаются кнопке на форме...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru