С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

88
zss
24.11.2015, 09:00     Почему при присваивании адреса массива не ставится знак '&' получения адреса
  #31

Не по теме:

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

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

0
Байт
24.11.2015, 09:49
  #32

Не по теме:

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

0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 09:51 #33
mporro, да ладно?
0
zer0mail
2383 / 2014 / 201
Регистрация: 03.07.2012
Сообщений: 7,259
Записей в блоге: 1
24.11.2015, 09:54 #34
Есть ли для программиста разница - является ли имя массива указателем или приводится оно к указателю?
При передаче в качестве параметра это одно и то же. А когда это не одно и то же, есть примеры?
0
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
24.11.2015, 10:06 #35
Цитата Сообщение от zer0mail Посмотреть сообщение
А когда это не одно и то же
далеко ходить не надо. sizeof.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 10:08 #36
zer0mail, ну сделай две функции, одна принимает массив, другая - указатель и посмотри, если ли разница. Ах, да, sizeof тоже не забудь.
0
mporro
256 / 101 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 10:31 #37
Croessmah
Так как в любом выражении, где требуется переменная int*, можно использовать переменную int a[], то очевидно, что массив -- это указатель. Хотя указатель -- это не массив, так как можно написать выражение верное для int a[5], но неверное для int*.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 11:08 #38
Цитата Сообщение от mporro Посмотреть сообщение
где требуется переменная int*, можно использовать переменную int a[]
очевиден неявный каст.
Ну и там, где требуется размер указателя, получим размер массива.
Например, литерал 0 имеет тип int, но может быть неявно преобразован к указателю, но это не делает из этого литерала указательный тип.
0
mporro
256 / 101 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 17:10 #39
Цитата Сообщение от Croessmah Посмотреть сообщение
это не делает из этого литерала указательный тип
Никто не запрещает одному объекту принадлежать разным типам. Неявное преобразование ноля в указатель говорит о том, что 0 -- это и целое число, и указатель.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 17:16 #40
Цитата Сообщение от 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
mporro
256 / 101 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 17:24 #41
Цитата Сообщение от Croessmah Посмотреть сообщение
У объекта один тип.
Да, это тип 0. Каждый объект принадлежит как минимум одной категории: один объект и одни морфизм Id.

Цитата Сообщение от Croessmah Посмотреть сообщение
Никаких конфликтов, потому что 0 - int
Никаких конфликтов, потому что есть определённые правила выбора перегруженной функции.

Тип определяется только тем, какие выражения являются верными над объектом.

Любое натуральное число -- целое. Любой массив -- указатель.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 17:29 #42
Цитата Сообщение от mporro Посмотреть сообщение
Любой массив -- указатель.
лишь преобразовывается в него.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.11.2015, 17:35 #43
Цитата Сообщение от Croessmah Посмотреть сообщение
У объекта один тип.
Класс один. А типов может быть несколько. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct A {};
struct B {};
struct C : A, B {};
 
void f(A&) {}
void f(B&) {}
 
int main()
{
    C c; // класс C; типы A,B,C
    f(c); // неоднозначаность, т.к. подходит и A, и B
}
Цитата Сообщение от Croessmah Посмотреть сообщение
Никаких конфликтов, потому что 0 - int
Веселье начинается когда ожидаешь, что f(NULL) вызовет версию для указателя, а вызывается для целого.
Кликните здесь для просмотра всего текста
nullptr спасет отца русской демократии
0
mporro
256 / 101 / 14
Регистрация: 04.07.2014
Сообщений: 571
24.11.2015, 17:35 #44
неявно
Цитата Сообщение от Croessmah Посмотреть сообщение
преобразовывается в него
То есть, состоит в отношении является.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
24.11.2015, 17:48 #45
http://stackoverflow.com/questions/3959705/arrays-are-pointers

Цитата Сообщение от Tulosba Посмотреть сообщение
Класс один. А типов может быть несколько.
вернемся
The term object type refers to the type with which the object is created.
0
24.11.2015, 17:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2015, 17:48
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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