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

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

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

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

22.11.2015, 21:01. Просмотров 1693. Ответов 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     Почему при присваивании адреса массива не ставится знак '&' получения адреса
Посмотрите здесь:
Операция получения адреса & и vector C++
Почему разные адреса одного и того же элемента динамического массива? C++
C++ [Указатели]Использование операции получения адреса операнда
C++ Синонимы операций взятия адреса массива (arr и &arr)
Почему при выводе односвязного списка на экран он выдаёт ещё какие-то дополнительные адреса? C++
C++ Оператор взятия адреса (&)
Почему адреса одинаковые? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fitochay
14 / 14 / 0
Регистрация: 14.03.2015
Сообщений: 102
22.11.2015, 21:07     Почему при присваивании адреса массива не ставится знак '&' получения адреса #2
В C++ использование имени массива без индекса образует указатель на первый элемент массива.
Вот
Байт
Эксперт C
15841 / 10168 / 1522
Регистрация: 24.12.2010
Сообщений: 19,175
22.11.2015, 21:57     Почему при присваивании адреса массива не ставится знак '&' получения адреса #3
Цитата Сообщение от Aqua77 Посмотреть сообщение
Почему при присваивании адреса массива не ставится знак '&' получения адреса
Массив - он уже сам адрес.
Упрощенно так. int mass[2] создает кусок памяти для хренения 2-х целых и переменную - адрес этой памяти. (эксперты, возможно. скажут, что это не совсем так, но тебе лучше сейчас представлять дело именно таким образом). Так что mass - это уже указатель(адрес). Присваивание int *b = mass имеет дело с сущностями одной природы.
Цитата Сообщение от Aqua77 Посмотреть сообщение
//А когда присваиваешь адрес отдельной переменной, то необходимо ставить этот знак.
Надеюсь, из вышеизложенного все уже понятно.
Цитата Сообщение от Aqua77 Посмотреть сообщение
И ещё адрес массива из пяти элементов передаст указателю все пять элементов?
Конечно нет! Он дает указатель только на первый элемент (адрес, где начинается массив). А про его длину он ничего не знает и знать не хочет. И в этом все прелести и все опасности языка Си.
Цитата Сообщение от Aqua77 Посмотреть сообщение
То есть, после такого присвоения указатель будет иметь все 5 адресов?
Надеюсь, что ответ на этот вопро уже понятен. Но доступ ко всем пяти элементам построен.
*b, *(b+4), *(b+100) - а вот тут ты уже обращаешься неизвестно куда. И программа твоя крашится.
Кстати, надо понять, что &a[5] абсолютно тоже самое, что и *(a+5)
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
22.11.2015, 22:02     Почему при присваивании адреса массива не ставится знак '&' получения адреса #4
Цитата Сообщение от Байт Посмотреть сообщение
ак что mass - это уже указатель(адрес).
Он неявно приводится к указателю на первый элемент.
Если бы "b" была указателем на массив, то пришлось бы использовать "&" для взятия адреса массива:
C++
1
2
    int a[2] = { 2, 3 };
    int(*b)[2] = &a;
Байт
22.11.2015, 22:08
  #5

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Если бы "b" была указателем на массив,
Слушай, не путай парня, а? Ты еще расскажи ему чем указатель на указатель на указатель отличается от просто указателя на указатель. И так - рекурсивно, пока голова не закружится. А ведь похоже, человек и правда пытается разобраться. Вот разберется - он тебе покажет, кошаку вредному

Croessmah
22.11.2015, 22:16
  #6

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Слушай, не путай парня, а?
Ок. Тогда еще покажем ссылку на массив:
C++
1
2
    int a[2] = { 2, 3 };
    int(&b)[2] = a;
Я ж вредный
Вот разберется - он тебе покажет, кошаку вредному
да ладно, я ж как лучше

Apparat_UA
5 / 5 / 2
Регистрация: 06.01.2015
Сообщений: 139
22.11.2015, 22:36     Почему при присваивании адреса массива не ставится знак '&' получения адреса #7
В случае с массивом, его имя является указателем. На самом деле такой формат mas[i] упрощение такого *(mas+i). Если просто написать *mas, то будем ссылаться на первый элемент так как *(mas+0). В памяти элементы массива распределяются друг за другом, компилятор определяет какого типа данные в массиве и когда мы пишем *(mas+i), он как бы доумножает это i на кол-во байт, выделяемых под каждый элемент. Если массив целых чисел, адреса будут отличать на 4 байта. Так суммируя адреса он доходит до нужного и просто разыменовывает его. То есть, если писать mas+i мы будем получать адреса элементов, что эквивалентно &mas[i].
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
22.11.2015, 22:39     Почему при присваивании адреса массива не ставится знак '&' получения адреса #8
Цитата Сообщение от Apparat_UA Посмотреть сообщение
В случае с массивом, его имя является указателем.
пост 4!
Apparat_UA
5 / 5 / 2
Регистрация: 06.01.2015
Сообщений: 139
22.11.2015, 23:03     Почему при присваивании адреса массива не ставится знак '&' получения адреса #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Он неявно приводится к указателю на первый элемент.
Если бы "b" была указателем на массив, то пришлось бы использовать "&" для взятия адреса массива
Спасибо. Где можно поподробнее почитать об этом ?
Байт
Эксперт C
15841 / 10168 / 1522
Регистрация: 24.12.2010
Сообщений: 19,175
22.11.2015, 23:20     Почему при присваивании адреса массива не ставится знак '&' получения адреса #10
Цитата Сообщение от Apparat_UA Посмотреть сообщение
Где можно поподробнее почитать об этом ?
Цитата Сообщение от Croessmah Посмотреть сообщение
Он неявно приводится к указателю на первый элемент.
Вечер поздний, спать неохота, а делать нечего. Давай попробуем этот момент разжевать. Пока кашей не станет.
На все объявленные в функции переменные (и параметры тож) в памяти выделяется некоторая область (стек называется, но - не суть). И в странслированной функции этот адрес есть (ей известен). И поэтому известны ей адреса всех переменных. Вот "int *b" выделяет кусочек памяти. А "int mass[2]" выделяет память только на массив. А указатель на этот массив ей не нужен. Он известен. Он - константа. И просто присутствует как таковая в сгенерированных командах. Вот и все. И самое сложное - это понять, что на самом деле все чрезвычайно просто
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
22.11.2015, 23:25     Почему при присваивании адреса массива не ставится знак '&' получения адреса #11
Apparat_UA, можно почитать тему, начиная с сообщения Ссылка на массив
Байт
22.11.2015, 23:39
  #12

Не по теме:

Croessmah, у меня зреет тема о том, как надо учить студиоузов. На первой лекции рассказать о чрезвычайной простоте и убогости вычислительной машины. О том, что она умеет делать только очень примитивные операции. И только то, что этих операций миллионы и выполняются они со скоростью миллиардов в секунду делает наш мир столь "прекрасным"

Aqua77
25 / 25 / 16
Регистрация: 13.07.2015
Сообщений: 430
23.11.2015, 10:07  [ТС]     Почему при присваивании адреса массива не ставится знак '&' получения адреса #13
Цитата Сообщение от Байт Посмотреть сообщение
&a[5] абсолютно тоже самое, что и *(a+5)
&a[5] - это адрес 6-го элемента а *(a+5) Значение элемента?

Добавлено через 15 минут
Цитата Сообщение от Apparat_UA Посмотреть сообщение
компилятор определяет какого типа данные в массиве и когда мы пишем *(mas+i), он как бы доумножает это i на кол-во байт, выделяемых под каждый элемент.
То есть если массив типа int, и я хочу обратится к 5-тому элементу компилятор зная что один элемент типа int содержит 4 байта умножает 4 на 5.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.11.2015, 10:41     Почему при присваивании адреса массива не ставится знак '&' получения адреса #14
Цитата Сообщение от Aqua77 Посмотреть сообщение
&a[5] - это адрес 6-го элемента а *(a+5) Значение элемента?
Да. Только для исключения путаницы, предпочтительнее писать не "6-го элемента", а "элемента с индексом 5", имхо.
Цитата Сообщение от Aqua77 Посмотреть сообщение
компилятор зная что один элемент типа int содержит 4 байта умножает 4 на 5.
Снова да Именно поэтому опасно в указателе на базовый класс хранить адрес начала массива класса производного.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
struct B {
    int i;
};
 
struct D : B {
    int j;
};
 
int main()
{
    D d[3];
    
    d[0].i = 1;
    d[0].j = 2;
    
    d[1].i = 3;
    d[1].j = 4;    
    
    d[2].i = 5;
    d[2].j = 6; 
    
    B* b = d; 
 
    std::cout << b[0].i << std::endl; // 1, ok
 
    std::cout << b[1].i << std::endl; // 2, но хотели бы 3
    
    std::cout << b[2].i << std::endl; // 3, но хотели бы 5   
}
http://coliru.stacked-crooked.com/a/d3dd451d7731aee2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2015, 11:58     Почему при присваивании адреса массива не ставится знак '&' получения адреса
Еще ссылки по теме:
C++ Почему выводит адреса?
C++ Почему указатели имеют одинаковые адреса
C++ Почему в scanf нужно указывать именно адреса переменных?
Почему адреса у указателей разные, несмотря на то, что они указывают на одну и ту же переменную? C++
Как работает операция взятия адреса "&"? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
23.11.2015, 11:58     Почему при присваивании адреса массива не ставится знак '&' получения адреса
  #15

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
На первой лекции рассказать о чрезвычайной простоте и убогости вычислительной машины. О том, что она умеет делать только очень примитивные операции. И только то, что этих операций миллионы и выполняются они со скоростью миллиардов в секунду делает наш мир столь "прекрасным"
Поздно. В какой-то книге я уже видел этот подход

Yandex
Объявления
23.11.2015, 11:58     Почему при присваивании адреса массива не ставится знак '&' получения адреса
Ответ Создать тему
Опции темы

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