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

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

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

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

22.11.2015, 21:01. Просмотров 1711. Ответов 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 адресов?
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; } Создаю каждый раз...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 17:52 #46
Croessmah
Pointers are not arrays. Именно это в действительности разобрано по ссылке.

Стандарт написан не только для тех, кто использует язык, но и для тех, кто реализует компиляторы, потому в стандарте есть детали реализации, в которые программисты, по существу, даже не должны лезть.
В частности для программиста нет разницы между неявным преобразованием и отношением является. Для тех, кто производит компиляторы разница есть. Им нужно решать -- есть ли необходимость создавать новый объект, когда можно, а когда нельзя применить оптимизацию.
Croessmah
Модератор
Эксперт CЭксперт С++
13154 / 7417 / 831
Регистрация: 27.09.2012
Сообщений: 18,254
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 18:02 #47
Цитата Сообщение от mporro Посмотреть сообщение
В частности для программиста нет разницы между неявным преобразованием и отношением является.
ага, а потом они бегают по форуму с вопросами почему не ставится и почему размер не тот
mporro
256 / 102 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 18:06 #48
Цитата Сообщение от Croessmah Посмотреть сообщение
а потом они бегают по форуму с вопросами почему
По этой причине всем новичкам C++ стоит говорить, что массив это вообще не int a[5], а классы из <valarray> или <array>. А за int a[5] бить по рукам линейкой.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.11.2015, 18:12 #49
Цитата Сообщение от Croessmah Посмотреть сообщение
вернемся
Так-то да (прям как объекты из Стандарта и от Саттера ).
Но с точки зрения ООП терминологии типов может быть несколько.
http://stackoverflow.com/a/769399/3240681

Добавлено через 44 секунды
Цитата Сообщение от mporro Посмотреть сообщение
массив это вообще не int a[5], а классы из <valarray> или <array>
Но-но-но. Палехче!
Croessmah
Модератор
Эксперт CЭксперт С++
13154 / 7417 / 831
Регистрация: 27.09.2012
Сообщений: 18,254
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 18:15 #50
Цитата Сообщение от Tulosba Посмотреть сообщение
Но с точки зрения ООП терминологии типов может быть несколько.
Тогда уж любой объект - это последовательность байт
Байт
24.11.2015, 18:17
  #51

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
любой объект - это последовательность байт
Да, да! Я всегда говорил это!

Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.11.2015, 18:23 #52
Цитата Сообщение от Croessmah Посмотреть сообщение
Тогда уж любой объект - это последовательность байт
Так и есть
An object is a region of storage.
Croessmah
Модератор
Эксперт CЭксперт С++
13154 / 7417 / 831
Регистрация: 27.09.2012
Сообщений: 18,254
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 18:26 #53
Цитата Сообщение от Tulosba Посмотреть сообщение
Так и есть
еще
The object representation of an object of type T is the sequence of N unsigned char objects taken up by the object of type T, where N equals sizeof(T). The value representation of an object is the set of bits that hold the value of type T.
Tulosba
24.11.2015, 18:35
  #54

Не по теме:

Ага. А человек - набор из мяса, костей и ведра кровищи. А не какой-то там индивидуум.

Croessmah
24.11.2015, 18:40
  #55

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
А человек - набор из мяса, костей и ведра кровищи.
мясо, кости, кровь - это составные типы

daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
24.11.2015, 19:14 #56
Новичкам надо говорить правду и вбивать им в голову, что есть стандарт, отладчик и ассемблерный код
(тут, правда, ассемблер не нужен, но иногда нужно к ассемблеру прибегать).

Вот им говорят, что имя массива - это указатель на его первый элемент, а он смотрит в отладчик и видит, что что-то не так. Кредит доверия отладчику резко упал, все отладчики стали говном, новичок им не верит, несет всякую чушь и задает тупые вопросы. (компиляторы у него ошибаются, отладчики бредят, только сам он умен, знаете ли, но почему-то там где-то косяк и тут где-то косяк и туча этих таких косяков. Надо задать вопрос, ведь объяснят лучше чем отладчик, стандарт и ассемблер. Чужое время, оно же гроша ломанного не стоит. Пусть на него любимого тратят свое. А все из мелочей пришло. Такие скользкие, неприятные мелочи. Недоговоренности, ошибочности).

(Я тоже жертва подобных неточностей).

У ТС вообще вопроса бы не возникло, если бы ему изначально было вдолблено, что тут неявное приведение. Что имя массива - всего-лишь идентификатор, некая сущность, которая даже переменной-то не является, но умеет становиться указателем на адрес своего начала и при необходимости становится им, потому что это стандартом оговорено.
Миниатюры
Почему при присваивании адреса массива не ставится знак '&' получения адреса  
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.11.2015, 20:54 #57
daslex,Почему при присваивании адреса массива не ставится знак '&' получения адреса
Из 2015 студии.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
24.11.2015, 21:04 #58
ну там значит область памяти типизирована
на моем скрине не типизирована.
неодназначность, а так как это студия, то даже стандарт ничего не расскажет. Товарищи из Microsoft, похоже тоже запутались.
___________
у меня тоже 2015 (pro).
zer0mail
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 1
25.11.2015, 07:23 #59
Цитата Сообщение от Tulosba Посмотреть сообщение
Из 2015 студии.
Точка останова на присвоении. так что в p еще ничего не записано.
zer0mail
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 1
25.11.2015, 07:38 #60
Небольшой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void fa(int a[2])   {   cout<<sizeof(a);    }
void fp(int* p)     {   cout<<sizeof(p);    }
int main()
{
    int i;
    int A[2];
    int *p=A;
    cout<<sizeof(A);
    cout<<sizeof(p);
    p=new int[5];
    cout<<sizeof(p)<<endl;
    fa(A);
    fa(p);
    fp(A);
    fp(p);
    return 0;
}
sizeof() при передаче массива, как параметра, возвращает размер указателя
Миниатюры
Почему при присваивании адреса массива не ставится знак '&' получения адреса  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2015, 07:38
Привет! Вот еще темы с ответами:

Почему адреса одинаковые? - 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
Объявления
25.11.2015, 07:38
Ответ Создать тему
Опции темы

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