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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 430
#1

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

22.11.2015, 21:01. Просмотров 1731. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2015, 21:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему при присваивании адреса массива не ставится знак '&' получения адреса (C++):

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

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

[Указатели]Использование операции получения адреса операнда - C++
Здравствуйте! Объясните пожалуйста, почему в пером случае, когда присваиваем указателю p_test адрес переменной test, использование...

Синонимы операций взятия адреса массива (arr и &arr) - C++
возможно коряво написал заголовок, да и сам вопрос банальный. после создании лок. массива его адрес можно получить при помощи его имени или...

Почему при выводе односвязного списка на экран он выдаёт ещё какие-то дополнительные адреса? - C++
Здравствуйте, помогите пожалуйста разобраться, почему при выводе односвязного списка на экран он мне выдаёт ещё какие-то дополнительные...

Оператор взятия адреса (&) - C++
while (true) { int *temp = new int(13); std::cout << temp << " "; std::cout << &temp << std::endl; } Создаю каждый раз...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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);
}
0
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);, так как указатель не является массивом из двух элементов.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4177 / 1805 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
27.11.2015, 06:22 #63
Цитата Сообщение от mporro Посмотреть сообщение
массив C -- не абстракция
Абстракция. Но не first-class citizen.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 07:35 #64
Ну как не стыдно замусоривать плюсовой раздел всякой сишней. Я, например, никогда не использую этот глупый недотип. А людям еще не лень обсуждать на многих страницах этот сишный идиотизм.
Мне вот другое интересно, почему даже при наличии типа array студенты массово используют в плюсах сишные массивы? Это же наверно от преподавателей исходит. А им это зачем? Какое-то необъяснимое массовое помешательство.
1
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
27.11.2015, 07:53 #65
Mr.X
Ну хоть один человек нормальный.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4177 / 1805 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
27.11.2015, 07:57 #66
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну как не стыдно
Страуструпу в своей книге "Язык программирования С++" не стыдно, так и нам нормально.
0
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
27.11.2015, 07:59 #67
Цитата Сообщение от gru74ik Посмотреть сообщение
Страуструпу не стыдно
Я как раз из "cтрауструпа" хорошо запомнил, что использовать массивы C нельзя, вместо них есть <valarray>.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4177 / 1805 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
27.11.2015, 08:13 #68
А я
Цитата Сообщение от mporro Посмотреть сообщение
как раз из "cтрауструпа" хорошо запомнил, что
обсуждать сишные массивы не стыдно. Иначе бы Страуструп не написал в своей книге по С++ про них несколько глав.
И вот такого
Цитата Сообщение от mporro Посмотреть сообщение
использовать массивы C нельзя, вместо них есть <valarray>
я что-то у Страуструпа не встречал. Имеются неоднократные упоминания о том, что вместо сишных массивов по разным причинам лучше использовать различные классы, например:
Цитата Сообщение от Бьярне Страуструп
Заметим, что большинство реализующих язык C++ программных средств не
предоставляет никаких способов контроля границ массива. Такая концепция
массивов весьма низкоуровневая. Более интеллектуальные концепции массивов
можно реализовать с помощью классов (§3.7.1).
Цитата Сообщение от Бьярне Страуструп
тип vector и другие типы стандартной библиотеки являются
прекрасной альтернативой низкоуровневым встроенным типам —
массивам и указателям.
Но нигде нет упоминания о том, что сишные массивы или их обсуждение в рамках языка С++ - это "стыдно" или что использовать сишные массивы в С++ "нельзя".
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 08:15 #69
Цитата Сообщение от gru74ik Посмотреть сообщение
Страуструпу в своей книге "Язык программирования С++" не стыдно, так и нам нормально.
Ну, он включил всю сишню для совместимости, однако в своей книжке не рекомендовал ей пользоваться, а предпочитать более высокоуровневые вещи.
Си - это примитивный полуассемблер, где многое сделано через задницу. Использовать эту белиберду в плюсах - глупо и позорно.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4177 / 1805 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
27.11.2015, 08:24 #70
Цитата Сообщение от Mr.X Посмотреть сообщение
в своей книжке не рекомендовал ей пользоваться, а предпочитать более высокоуровневые вещи
С этим согласен.

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

Цитата Сообщение от Mr.X Посмотреть сообщение
Использовать эту белиберду в плюсах - глупо и позорно
Чаще всего неоправданно. Зачастую глупо, согласен. Позорно - не соглашусь. Студентов учат как внутри устроен вектор и стринг не зря. А без знания сишных указателей и массивов, эти темы нормально не усвоишь.
0
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,677
27.11.2015, 08:30 #71
А уж как удобно юзать многомерные массивы, которые array, ведь
C++
1
2
array<array<array<int,10>,20>,30> arr; //Заметно лаконичнее и читабельнее чем
int arr[10][20][30]
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
27.11.2015, 08:36 #72
Цитата Сообщение от gru74ik Посмотреть сообщение
Для своего круга задач Си - прекрасный язык.
Ну, эффективный - да. Именно поэтому его Страуструп и взял за основу. Однако он не является языком высокого уровня, а только имитирует таковой, предоставляя вместо типов недотипы вроде массивов и сишных строк. Не знаю что вы в них прекрасного видите. Мне кажется, на них легче плюнуть, чем изучать и использовать.
0
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,677
27.11.2015, 08:45 #73
А вот что писано у Страуструпа
Однако массивы существовали задолго до появления векторов и являлись их приблизительным прототипом во многих языках (особенно в языке С),поэтому их следует знать хорошо, чтобы иметь возможность работать со старыми программами или с программами, написанными людьми, не признающими преимущества класса vector.
1
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 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
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,677
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2015, 09:52
Привет! Вот еще темы с ответами:

Почему адреса одинаковые? - C++
Обьясните пожалуйста код, почему адреса одинаковые? #include &lt;iostream&gt; using namespace std; int main() { char *s =...

Почему выводит адреса? - C++
Всем привет! Программа работает, но почему то выводит данные вместе с адресом (см. скриншот). Скажите, почему так? #include&lt;iostream&gt; ...

Почему указатели имеют одинаковые адреса - C++
Например, если взять указатели на массивы. **m имеет тот же адрес, что и *m, что и m

Почему в scanf нужно указывать именно адреса переменных? - C++
Почему в функции scanf нужно указывать именно адреса переменных? Почему не работает, когда указываем переменную? Что хранит в себе...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.11.2015, 09:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru