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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Aqua77
4 / 4 / 1
Регистрация: 13.07.2015
Сообщений: 315
22.11.2015, 21:01     Почему при присваивании адреса массива не ставится знак '&' получения адреса #1
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 адресов?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2015, 21:01     Почему при присваивании адреса массива не ставится знак '&' получения адреса
Посмотрите здесь:

C++ Почему указатели имеют одинаковые адреса
Определить адреса и значения элементов массива C++
C++ Почему выводит адреса?
C++ [Указатели]Использование операции получения адреса операнда
C++ Найти адреса элементов массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.11.2015, 08:00     Почему при присваивании адреса массива не ставится знак '&' получения адреса #61
Цитата Сообщение от zer0mail Посмотреть сообщение
Точка останова на присвоении. так что в p еще ничего не записано.
Картинка использовалась для демонстрации типа, а не значения.
Цитата Сообщение от zer0mail Посмотреть сообщение
Небольшой пример:
Если fa и fp имели бы одинаковые имена, сразу получил бы ошибку компиляции, из-за идентичности сигнатур. И дальнейшие изыскания с sizeof стали бы очевидны.

Хочется передавать именно массив и получать его размер через sizeof? Придется прибегнуть к ссылкам и шаблонам:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
template <class T, int N>
void f( T (&a)[N] ) {
    std::cout << sizeof(a) << std::endl;
}
 
int main() {
    int a[10];
    f(a);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
25.11.2015, 08:58     Почему при присваивании адреса массива не ставится знак '&' получения адреса #62
Цитата Сообщение от zer0mail Посмотреть сообщение
Небольшой пример:
Это очередная накладка в попытке использовать массив как абстракцию.
К сожалению, массив C -- не абстракция.
Нет возможности передать в функцию объект-массив-C. Если бы Вы включили опцию -Wall, то сразу бы всё увидели.

А если Вы напишите функцию с сигнатурой void farray(int (&array)[2]);, не передаём объект, а его имя, то получите ошибку компиляции при вызове farray(p);, так как указатель не является массивом из двух элементов.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 06:22     Почему при присваивании адреса массива не ставится знак '&' получения адреса #63
Цитата Сообщение от mporro Посмотреть сообщение
массив C -- не абстракция
Абстракция. Но не first-class citizen.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
27.11.2015, 07:35     Почему при присваивании адреса массива не ставится знак '&' получения адреса #64
Ну как не стыдно замусоривать плюсовой раздел всякой сишней. Я, например, никогда не использую этот глупый недотип. А людям еще не лень обсуждать на многих страницах этот сишный идиотизм.
Мне вот другое интересно, почему даже при наличии типа array студенты массово используют в плюсах сишные массивы? Это же наверно от преподавателей исходит. А им это зачем? Какое-то необъяснимое массовое помешательство.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
27.11.2015, 07:53     Почему при присваивании адреса массива не ставится знак '&' получения адреса #65
Mr.X
Ну хоть один человек нормальный.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 07:57     Почему при присваивании адреса массива не ставится знак '&' получения адреса #66
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну как не стыдно
Страуструпу в своей книге "Язык программирования С++" не стыдно, так и нам нормально.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
27.11.2015, 07:59     Почему при присваивании адреса массива не ставится знак '&' получения адреса #67
Цитата Сообщение от gru74ik Посмотреть сообщение
Страуструпу не стыдно
Я как раз из "cтрауструпа" хорошо запомнил, что использовать массивы C нельзя, вместо них есть <valarray>.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 08:13     Почему при присваивании адреса массива не ставится знак '&' получения адреса #68
А я
Цитата Сообщение от mporro Посмотреть сообщение
как раз из "cтрауструпа" хорошо запомнил, что
обсуждать сишные массивы не стыдно. Иначе бы Страуструп не написал в своей книге по С++ про них несколько глав.
И вот такого
Цитата Сообщение от mporro Посмотреть сообщение
использовать массивы C нельзя, вместо них есть <valarray>
я что-то у Страуструпа не встречал. Имеются неоднократные упоминания о том, что вместо сишных массивов по разным причинам лучше использовать различные классы, например:
Цитата Сообщение от Бьярне Страуструп
Заметим, что большинство реализующих язык C++ программных средств не
предоставляет никаких способов контроля границ массива. Такая концепция
массивов весьма низкоуровневая. Более интеллектуальные концепции массивов
можно реализовать с помощью классов (§3.7.1).
Цитата Сообщение от Бьярне Страуструп
тип vector и другие типы стандартной библиотеки являются
прекрасной альтернативой низкоуровневым встроенным типам —
массивам и указателям.
Но нигде нет упоминания о том, что сишные массивы или их обсуждение в рамках языка С++ - это "стыдно" или что использовать сишные массивы в С++ "нельзя".
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
27.11.2015, 08:15     Почему при присваивании адреса массива не ставится знак '&' получения адреса #69
Цитата Сообщение от gru74ik Посмотреть сообщение
Страуструпу в своей книге "Язык программирования С++" не стыдно, так и нам нормально.
Ну, он включил всю сишню для совместимости, однако в своей книжке не рекомендовал ей пользоваться, а предпочитать более высокоуровневые вещи.
Си - это примитивный полуассемблер, где многое сделано через задницу. Использовать эту белиберду в плюсах - глупо и позорно.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 08:24     Почему при присваивании адреса массива не ставится знак '&' получения адреса #70
Цитата Сообщение от Mr.X Посмотреть сообщение
в своей книжке не рекомендовал ей пользоваться, а предпочитать более высокоуровневые вещи
С этим согласен.

Цитата Сообщение от Mr.X Посмотреть сообщение
Си - это примитивный полуассемблер, где многое сделано через задницу.
С этим не согласен. Для своего круга задач Си - прекрасный язык. Иначе его бы не использовали до сих пор.

Цитата Сообщение от Mr.X Посмотреть сообщение
Использовать эту белиберду в плюсах - глупо и позорно
Чаще всего неоправданно. Зачастую глупо, согласен. Позорно - не соглашусь. Студентов учат как внутри устроен вектор и стринг не зря. А без знания сишных указателей и массивов, эти темы нормально не усвоишь.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
27.11.2015, 08:30     Почему при присваивании адреса массива не ставится знак '&' получения адреса #71
А уж как удобно юзать многомерные массивы, которые array, ведь
C++
1
2
array<array<array<int,10>,20>,30> arr; //Заметно лаконичнее и читабельнее чем
int arr[10][20][30]
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
27.11.2015, 08:36     Почему при присваивании адреса массива не ставится знак '&' получения адреса #72
Цитата Сообщение от gru74ik Посмотреть сообщение
Для своего круга задач Си - прекрасный язык.
Ну, эффективный - да. Именно поэтому его Страуструп и взял за основу. Однако он не является языком высокого уровня, а только имитирует таковой, предоставляя вместо типов недотипы вроде массивов и сишных строк. Не знаю что вы в них прекрасного видите. Мне кажется, на них легче плюнуть, чем изучать и использовать.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
27.11.2015, 08:45     Почему при присваивании адреса массива не ставится знак '&' получения адреса #73
А вот что писано у Страуструпа
Однако массивы существовали задолго до появления векторов и являлись их приблизительным прототипом во многих языках (особенно в языке С),поэтому их следует знать хорошо, чтобы иметь возможность работать со старыми программами или с программами, написанными людьми, не признающими преимущества класса vector.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
27.11.2015, 09:06     Почему при присваивании адреса массива не ставится знак '&' получения адреса #74
Цитата Сообщение от daslex Посмотреть сообщение
А уж как удобно юзать многомерные массивы, которые array, ведь
C++
1
2
array<array<array<int,10>,20>,30> arr; //Заметно лаконичнее и читабельнее чем
int arr[10][20][30]
А typedef уже отменили что ли?
C++
1
2
typedef std::array  < int,      2   >   T_row;
typedef std::array  < T_row,    2   >   T_matr;
Добавлено через 4 минуты
Цитата Сообщение от daslex Посмотреть сообщение
А вот что писано у Страуструпа
Непонятно, вы в защиту массивов это цитируете или наоборот?
Написано, что знать надо, а использовать он не рекомендует.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
27.11.2015, 09:52     Почему при присваивании адреса массива не ставится знак '&' получения адреса #75
Почему при присваивании адреса массива не ставится знак '&' получения адреса
Читаем создателя С++, почему у него с его предшественниками именно так допускается и видим ответ на вопрос ТС

Имя массива относится ко всем элементам массива. Рассмотрим пример,
char ch[100];
Размер массива ch, т.е. sizeof (ch), равен 100. Однако имя массива без видимых причин превращается в указатель.
А зачем оно ему понадобилось, написано им же
Одна из причин, по которым имена массивов могут превращаться в указатели, состоит в желании избежать передачи большого объема данных по значению.
Он из редких людей, кто говорит об имени массива, не как об указателе. В отличии от многих последующих авторов учебной литературы, которые своим допущением ввели много народу в заблуждения.
Обратите внимание на то, что указатель, образованный из имени массива, установлен на его первый элемент и не является переменной, т.е. ему ничего нельзя присвоить.
Во избежание тупых холиваров некоторых самоуверенных знатоков (к титанам форума это отношения не имеет, я имею ввиду свой уровень знаний и ниже его).
Листинги
C++
1
2
 const int z = 100;
 const int * const p = &z; //Константный указатель на константу
если считать массив константным указателем, то он обязан уметь делать то, что умеет делать константный указатель.
C++
1
2
const int z[100] = {1,2};
 const int p[100] = z; //Попытка инициализировать массив, константными значениями, скопировав их из z прямое следствие ошибки интерпретации имени массива как константного указателя на начало
И на десерт —
проблема, которую компилятор может перехватить!
Вследствие неявного превращения имени массива в указатель мы не можем даже
скопировать массивы с помощью оператора присваивания.
В том числе у Страуструпа достаточно много напутствий на использование более высокоуровневых массивов чем сишные массивы
Люди часто сами создают себе проблемы, используя указатели и массивы.
Класс vector следует использовать при любой возможности.
В С++ 11 Класс array, о котором в старых книгах не пишут, но безусловно бы советовали использовать и его при необходимости создавать массив фиксированного размера.
__________________________

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

Не по теме:

столько холивару на простой и очень не редкий вопрос, что просто жесть.

gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 10:25     Почему при присваивании адреса массива не ставится знак '&' получения адреса #76
Цитата Сообщение от Mr.X Посмотреть сообщение
Непонятно, вы в защиту массивов это цитируете или наоборот?
А третий вариант не судьба предположить? Только бинарная логика? Чёрное/белое?
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
27.11.2015, 10:39     Почему при присваивании адреса массива не ставится знак '&' получения адреса #77
Цитата Сообщение от gru74ik Посмотреть сообщение
А третий вариант не судьба предположить? Только бинарная логика? Чёрное/белое?
Туманное сообщение... А почему сразу третий, а не триста пятьдесят восьмой?
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 10:51     Почему при присваивании адреса массива не ставится знак '&' получения адреса #78
Mr.X, потому что Вы рассуждаете в терминах хороший/плохой, чёрный/белый, позорный/достойный. А то, что обе концепции имеют право на жизнь в голову не приходило?
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
27.11.2015, 10:59     Почему при присваивании адреса массива не ставится знак '&' получения адреса #79
Цитата Сообщение от gru74ik Посмотреть сообщение
Mr.X, потому что Вы рассуждаете в терминах хороший/плохой, чёрный/белый, позорный/достойный. А то, что обе концепции имеют право на жизнь в голову не приходило?
Не, ну если мы к чему-то относимся нейтрально, то обычно об этом не спорим и не дискутируем. Вот в вашем сообщении чувствуется обвинительный уклон, а нет, чтобы нейтрально подойти или каким-нибудь 358-м способом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2015, 11:18     Почему при присваивании адреса массива не ставится знак '&' получения адреса
Еще ссылки по теме:

Почему адреса одинаковые? C++
C++ Почему в scanf нужно указывать именно адреса переменных?
Операция получения адреса & и vector C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,836
Записей в блоге: 17
27.11.2015, 11:18     Почему при присваивании адреса массива не ставится знак '&' получения адреса #80
Mr.X, не знаю что Вам чувствуется.
Цитата Сообщение от Mr.X Посмотреть сообщение
Вот в вашем сообщении чувствуется обвинительный уклон
На Вашу сферу чувств я влияния не имею. Да и нет у меня таких намерений, на Ваши чувства влиять. Вы не красна девица, чтоб мне ещё на этот счёт волноваться. В таких темах (как эта), я полагаю, люди общаются на уровне интеллектуальном, рациональном, логическом, а не на уровне эмоций. Более того, последнее чаще всего не приветствуется администрацией форума. Хотите аргументировать? Аргументируйте. Приводите код, цитаты из стандарта, из книг. А эмоции барышням оставьте.

Цитата Сообщение от Mr.X Посмотреть сообщение
если мы к чему-то относимся нейтрально, то обычно об этом не спорим и не дискутируем
Разумеется. Собственно, мне Ваша симпатия к STL импонирует и у меня в мыслях не было "защищать сишников". Но категоричность суждений для меня как красная тряпка для быка - меня это раздражает.
Моя позиция такова: есть старые сишные массивы, есть STL и классы типа valarray. Всему своё место и время. Это просто инструменты. Они не хорошие и не плохие. Где-то уместнее одни, где-то другие.
Yandex
Объявления
27.11.2015, 11:18     Почему при присваивании адреса массива не ставится знак '&' получения адреса
Ответ Создать тему
Опции темы

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