| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Имя массива как указатель |
| Автор: IValdemar 26.1.2013, 14:49 | ||
Есть следующий код
тут mas имеет тип int*, т.к. имя массива является указателем на первый элемент. Вполне логично что mas = &mas[0]; , но если посмотреть адрес самого указателя получаем &mas = mas = &mas[0]. Получается что указатель и первый элемент находятся по одному адресу памяти. На вопрос как такое возможно преподаватель ответил, что имя массива принято считать указателем на первый элемент, но фактически этого указателя не существует. На вопрос, что же такое тогда из себя представляет этот псевдо-указатель, он ответить не смог. Отсюда вопрос: чем же является имя массива на самом деле? Если это не полноценный указатель, который не существует в памяти, почему к нему можно применить оператор взятия адреса? В общем интересно как это все организовано. Если это можно посмотреть где-нибудь в библиотеках или еще где-то, прошу написать. |
| Автор: volatile 26.1.2013, 17:26 | ||||
В корне не верно!!! mas имеет тип int [10];
это скомпилицца.
а это не скомпилицца Все остальное, происходит вследствии неявного преобразования типов. Другими словами, компилятор, в некоторых случаях, молча преобразует int [10] к int*; Поэтому некоторым кажецца что это одно и тоже |
| Автор: IValdemar 26.1.2013, 18:18 | ||
| volatile, Большое спасибо за ответ. Получается есть такой тип данных int[10]? Тогда имя массива в данном случае имеет тип int[10], при операции sizeof мы получаем объем всего массива (в данном случае 40) а операцией взятия адреса мы получаем адрес первого элемента.
В данном коде идет преобразование int[10] к int* и в somePtr записывается адрес первого элемента. Значит int[10] преобразуется в тип int*. Это я правильно понял? А результатом операции &mas будет int[10]* или просто int*? Если где-то про это можно почитать киньте ссылочку, а то я про такое первый раз слышу. |
| Автор: volatile 26.1.2013, 19:51 |
да первое, только правильно оно записываецца так: int (*) [10] где почитать именно про это - поискать надо. Может кто кинет ссылку... |
| Автор: IValdemar 26.1.2013, 21:03 | ||||||
Кажется примерно разобрался
Я так понимаю хоть типы и разные принципиального отличия между ними нет.
Такая запись будет эквивалентна, правильно? |
| Автор: volatile 26.1.2013, 23:27 | ||||||||||||
Здесь всё правильно.
Нет не эквивалентна! (*p1)[3] = 4; вообще не имеет смысла. p1 - Указатель на int *p1 - int (*p1)[3] - не имеет смысла. У int нет оператора [] (*p2)[3] = 4; - это нормально. p2 - Указатель массив из 10 целых. *p2 - массив из 10 целых. (*p2)[3] - вполне имеет смысл, третий элемент массива. IValdemar, в остальном мыслите правильно. Добавлено через 5 минут и 17 секунд Вот так, эквивалентно:
|
| Автор: IValdemar 27.1.2013, 14:03 |
| volatile, спасибо, я думаю дальше разберусь. |