25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2015, 21:01
Ответы с готовыми решениями:

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

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

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

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

88
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.11.2015, 08:00 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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);
}
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
25.11.2015, 08:58 62
Цитата Сообщение от zer0mail Посмотреть сообщение
Небольшой пример:
Это очередная накладка в попытке использовать массив как абстракцию.
К сожалению, массив C -- не абстракция.
Нет возможности передать в функцию объект-массив-C. Если бы Вы включили опцию -Wall, то сразу бы всё увидели.

А если Вы напишите функцию с сигнатурой void farray(int (&array)[2]);, не передаём объект, а его имя, то получите ошибку компиляции при вызове farray(p);, так как указатель не является массивом из двух элементов.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 06:22 63
Цитата Сообщение от mporro Посмотреть сообщение
массив C -- не абстракция
Абстракция. Но не first-class citizen.
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 07:35 64
Ну как не стыдно замусоривать плюсовой раздел всякой сишней. Я, например, никогда не использую этот глупый недотип. А людям еще не лень обсуждать на многих страницах этот сишный идиотизм.
Мне вот другое интересно, почему даже при наличии типа array студенты массово используют в плюсах сишные массивы? Это же наверно от преподавателей исходит. А им это зачем? Какое-то необъяснимое массовое помешательство.
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
27.11.2015, 07:53 65
Mr.X
Ну хоть один человек нормальный.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 07:57 66
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну как не стыдно
Страуструпу в своей книге "Язык программирования С++" не стыдно, так и нам нормально.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
27.11.2015, 07:59 67
Цитата Сообщение от gru74ik Посмотреть сообщение
Страуструпу не стыдно
Я как раз из "cтрауструпа" хорошо запомнил, что использовать массивы C нельзя, вместо них есть <valarray>.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 08:13 68
А я
Цитата Сообщение от mporro Посмотреть сообщение
как раз из "cтрауструпа" хорошо запомнил, что
обсуждать сишные массивы не стыдно. Иначе бы Страуструп не написал в своей книге по С++ про них несколько глав.
И вот такого
Цитата Сообщение от mporro Посмотреть сообщение
использовать массивы C нельзя, вместо них есть <valarray>
я что-то у Страуструпа не встречал. Имеются неоднократные упоминания о том, что вместо сишных массивов по разным причинам лучше использовать различные классы, например:
Цитата Сообщение от Бьярне Страуструп
Заметим, что большинство реализующих язык C++ программных средств не
предоставляет никаких способов контроля границ массива. Такая концепция
массивов весьма низкоуровневая. Более интеллектуальные концепции массивов
можно реализовать с помощью классов (§3.7.1).
Цитата Сообщение от Бьярне Страуструп
тип vector и другие типы стандартной библиотеки являются
прекрасной альтернативой низкоуровневым встроенным типам —
массивам и указателям.
Но нигде нет упоминания о том, что сишные массивы или их обсуждение в рамках языка С++ - это "стыдно" или что использовать сишные массивы в С++ "нельзя".
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 08:15 69
Цитата Сообщение от gru74ik Посмотреть сообщение
Страуструпу в своей книге "Язык программирования С++" не стыдно, так и нам нормально.
Ну, он включил всю сишню для совместимости, однако в своей книжке не рекомендовал ей пользоваться, а предпочитать более высокоуровневые вещи.
Си - это примитивный полуассемблер, где многое сделано через задницу. Использовать эту белиберду в плюсах - глупо и позорно.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 08:24 70
Цитата Сообщение от Mr.X Посмотреть сообщение
в своей книжке не рекомендовал ей пользоваться, а предпочитать более высокоуровневые вещи
С этим согласен.

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

Цитата Сообщение от Mr.X Посмотреть сообщение
Использовать эту белиберду в плюсах - глупо и позорно
Чаще всего неоправданно. Зачастую глупо, согласен. Позорно - не соглашусь. Студентов учат как внутри устроен вектор и стринг не зря. А без знания сишных указателей и массивов, эти темы нормально не усвоишь.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
27.11.2015, 08:30 71
А уж как удобно юзать многомерные массивы, которые array, ведь
C++
1
2
array<array<array<int,10>,20>,30> arr; //Заметно лаконичнее и читабельнее чем
int arr[10][20][30]
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 08:36 72
Цитата Сообщение от gru74ik Посмотреть сообщение
Для своего круга задач Си - прекрасный язык.
Ну, эффективный - да. Именно поэтому его Страуструп и взял за основу. Однако он не является языком высокого уровня, а только имитирует таковой, предоставляя вместо типов недотипы вроде массивов и сишных строк. Не знаю что вы в них прекрасного видите. Мне кажется, на них легче плюнуть, чем изучать и использовать.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
27.11.2015, 08:45 73
А вот что писано у Страуструпа
Однако массивы существовали задолго до появления векторов и являлись их приблизительным прототипом во многих языках (особенно в языке С),поэтому их следует знать хорошо, чтобы иметь возможность работать со старыми программами или с программами, написанными людьми, не признающими преимущества класса vector.
1
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
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 Посмотреть сообщение
А вот что писано у Страуструпа
Непонятно, вы в защиту массивов это цитируете или наоборот?
Написано, что знать надо, а использовать он не рекомендует.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
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, о котором в старых книгах не пишут, но безусловно бы советовали использовать и его при необходимости создавать массив фиксированного размера.
__________________________

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

Не по теме:

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

1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 10:25 76
Цитата Сообщение от Mr.X Посмотреть сообщение
Непонятно, вы в защиту массивов это цитируете или наоборот?
А третий вариант не судьба предположить? Только бинарная логика? Чёрное/белое?
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 10:39 77
Цитата Сообщение от gru74ik Посмотреть сообщение
А третий вариант не судьба предположить? Только бинарная логика? Чёрное/белое?
Туманное сообщение... А почему сразу третий, а не триста пятьдесят восьмой?
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 10:51 78
Mr.X, потому что Вы рассуждаете в терминах хороший/плохой, чёрный/белый, позорный/достойный. А то, что обе концепции имеют право на жизнь в голову не приходило?
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 10:59 79
Цитата Сообщение от gru74ik Посмотреть сообщение
Mr.X, потому что Вы рассуждаете в терминах хороший/плохой, чёрный/белый, позорный/достойный. А то, что обе концепции имеют право на жизнь в голову не приходило?
Не, ну если мы к чему-то относимся нейтрально, то обычно об этом не спорим и не дискутируем. Вот в вашем сообщении чувствуется обвинительный уклон, а нет, чтобы нейтрально подойти или каким-нибудь 358-м способом.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
27.11.2015, 11:18 80
Mr.X, не знаю что Вам чувствуется.
Цитата Сообщение от Mr.X Посмотреть сообщение
Вот в вашем сообщении чувствуется обвинительный уклон
На Вашу сферу чувств я влияния не имею. Да и нет у меня таких намерений, на Ваши чувства влиять. Вы не красна девица, чтоб мне ещё на этот счёт волноваться. В таких темах (как эта), я полагаю, люди общаются на уровне интеллектуальном, рациональном, логическом, а не на уровне эмоций. Более того, последнее чаще всего не приветствуется администрацией форума. Хотите аргументировать? Аргументируйте. Приводите код, цитаты из стандарта, из книг. А эмоции барышням оставьте.

Цитата Сообщение от Mr.X Посмотреть сообщение
если мы к чему-то относимся нейтрально, то обычно об этом не спорим и не дискутируем
Разумеется. Собственно, мне Ваша симпатия к STL импонирует и у меня в мыслях не было "защищать сишников". Но категоричность суждений для меня как красная тряпка для быка - меня это раздражает.
Моя позиция такова: есть старые сишные массивы, есть STL и классы типа valarray. Всему своё место и время. Это просто инструменты. Они не хорошие и не плохие. Где-то уместнее одни, где-то другие.
1
27.11.2015, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2015, 11:18
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru