![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
IValdemar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
Есть следующий код
тут mas имеет тип int*, т.к. имя массива является указателем на первый элемент. Вполне логично что mas = &mas[0]; , но если посмотреть адрес самого указателя получаем &mas = mas = &mas[0]. Получается что указатель и первый элемент находятся по одному адресу памяти. На вопрос как такое возможно преподаватель ответил, что имя массива принято считать указателем на первый элемент, но фактически этого указателя не существует. На вопрос, что же такое тогда из себя представляет этот псевдо-указатель, он ответить не смог. Отсюда вопрос: чем же является имя массива на самом деле? Если это не полноценный указатель, который не существует в памяти, почему к нему можно применить оператор взятия адреса? В общем интересно как это все организовано. Если это можно посмотреть где-нибудь в библиотеках или еще где-то, прошу написать. |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
В корне не верно!!! mas имеет тип int [10];
это скомпилицца.
а это не скомпилицца Все остальное, происходит вследствии неявного преобразования типов. Другими словами, компилятор, в некоторых случаях, молча преобразует int [10] к int*; Поэтому некоторым кажецца что это одно и тоже |
||||
|
|||||
IValdemar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
volatile, Большое спасибо за ответ.
Получается есть такой тип данных int[10]? Тогда имя массива в данном случае имеет тип int[10], при операции sizeof мы получаем объем всего массива (в данном случае 40) а операцией взятия адреса мы получаем адрес первого элемента.
В данном коде идет преобразование int[10] к int* и в somePtr записывается адрес первого элемента. Значит int[10] преобразуется в тип int*. Это я правильно понял? А результатом операции &mas будет int[10]* или просто int*? Если где-то про это можно почитать киньте ссылочку, а то я про такое первый раз слышу. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
да первое, только правильно оно записываецца так: int (*) [10] где почитать именно про это - поискать надо. Может кто кинет ссылку... |
|||
|
||||
IValdemar |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
Кажется примерно разобрался
Я так понимаю хоть типы и разные принципиального отличия между ними нет.
Такая запись будет эквивалентна, правильно? |
||||||
|
|||||||
volatile |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Здесь всё правильно.
Нет не эквивалентна! (*p1)[3] = 4; вообще не имеет смысла. p1 - Указатель на int *p1 - int (*p1)[3] - не имеет смысла. У int нет оператора [] (*p2)[3] = 4; - это нормально. p2 - Указатель массив из 10 целых. *p2 - массив из 10 целых. (*p2)[3] - вполне имеет смысл, третий элемент массива. IValdemar, в остальном мыслите правильно. Добавлено через 5 минут и 17 секунд Вот так, эквивалентно:
|
||||||||||||
|
|||||||||||||
IValdemar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
volatile, спасибо, я думаю дальше разберусь.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |