Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Имя массива как указатель, что же такое имя массива на самом деле 
V
    Опции темы
IValdemar
Дата 26.1.2013, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.1.2012

Репутация: нет
Всего: нет



Есть следующий код
Код

int mas[10];

тут mas имеет тип int*, т.к. имя массива является указателем на первый элемент.
Вполне логично что mas = &mas[0]; , но если посмотреть адрес самого указателя получаем &mas = mas = &mas[0].
Получается что указатель и первый элемент находятся по одному адресу памяти.

На вопрос как такое возможно преподаватель ответил, что имя массива принято считать указателем на первый элемент, но фактически этого указателя не существует. На вопрос, что же такое тогда из себя представляет этот псевдо-указатель, он ответить не смог. 

Отсюда вопрос: чем же является имя массива на самом деле? Если это не полноценный указатель, который не существует в памяти, почему к нему можно применить оператор взятия адреса? 

В общем интересно как это все организовано. Если это можно посмотреть где-нибудь в библиотеках или еще где-то, прошу написать.
PM MAIL Skype   Вверх
volatile
Дата 26.1.2013, 17:26 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(IValdemar @  26.1.2013,  14:49 Найти цитируемый пост)
тут mas имеет тип int*, 

В корне не верно!!!
mas имеет тип int [10];

Код

typedef int mas_type [10];
mas_type mas = {1,2,3,4,5,6,7,8,9,10};

это скомпилицца.

Код

typedef int * mas_type;
mas_type mas = {1,2,3,4,5,6,7,8,9,10};

а это не скомпилицца

Все остальное, происходит вследствии неявного преобразования типов.
Другими словами, компилятор, в некоторых случаях, молча преобразует int [10] к int*;
Поэтому некоторым кажецца что это одно и тоже


PM MAIL   Вверх
IValdemar
Дата 26.1.2013, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.1.2012

Репутация: нет
Всего: нет



volatile, Большое спасибо за ответ.
Получается есть такой тип данных int[10]?  Тогда имя массива в данном случае имеет тип int[10], при операции sizeof мы получаем объем всего массива (в данном случае 40) а операцией взятия адреса мы получаем адрес первого элемента.
Код

int* somePtr = mas;

В данном коде идет преобразование int[10] к int* и в somePtr записывается адрес первого элемента. Значит int[10] преобразуется в тип int*.
Это я правильно понял?

А результатом операции &mas будет int[10]* или просто int*?

Если где-то про это можно почитать киньте ссылочку, а то я про такое первый раз слышу.
PM MAIL Skype   Вверх
volatile
Дата 26.1.2013, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(IValdemar @  26.1.2013,  18:18 Найти цитируемый пост)
Значит int[10] преобразуется в тип int*.
Это я правильно понял?

да

Цитата(IValdemar @  26.1.2013,  18:18 Найти цитируемый пост)
А результатом операции &mas будет int[10]* или просто int*?

первое, только правильно оно записываецца так:
int (*) [10]

где почитать именно про это - поискать надо. Может кто кинет ссылку...

PM MAIL   Вверх
IValdemar
Дата 26.1.2013, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.1.2012

Репутация: нет
Всего: нет



Кажется примерно разобрался
Код

int* p; //Указатель на int, целое число.
int(*p2)[10];//Указатель на int[10], массив из 10 целых чисел.


Код

int mas[10];

int* p1 =(int*) &mas;
int(*p2)[10] = &mas;


Я так понимаю хоть типы и разные принципиального отличия между ними нет. 
Код

(*p1)[3] = 4;
(*p2)[3] = 4;

Такая запись будет эквивалентна, правильно?
PM MAIL Skype   Вверх
volatile
Дата 26.1.2013, 23:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(IValdemar @ 26.1.2013,  21:03)
Кажется примерно разобрался
Код

int* p; //Указатель на int, целое число.
int(*p2)[10];//Указатель на int[10], массив из 10 целых чисел.

Здесь всё правильно.

Цитата(IValdemar @ 26.1.2013,  21:03)
Код

int mas[10];

int* p1 =(int*) &mas;
int(*p2)[10] = &mas;


Я так понимаю хоть типы и разные принципиального отличия между ними нет. 
Код

(*p1)[3] = 4;
(*p2)[3] = 4;

Такая запись будет эквивалентна, правильно?


Нет не эквивалентна!
 (*p1)[3] = 4; вообще не имеет смысла.
p1 - Указатель на int
*p1 - int
(*p1)[3] - не имеет смысла. У int нет оператора []

(*p2)[3] = 4; - это нормально.
p2 - Указатель массив из 10 целых.
*p2 - массив из 10 целых.
(*p2)[3] - вполне имеет смысл, третий элемент массива.


IValdemar, в остальном мыслите правильно.

Добавлено через 5 минут и 17 секунд

Вот так,  эквивалентно:
Код

p1[3] = 4;
(*p2)[3] = 4;


PM MAIL   Вверх
IValdemar
Дата 27.1.2013, 14:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.1.2012

Репутация: нет
Всего: нет



volatile, спасибо, я думаю дальше разберусь.
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.