Имя массива как указатель

 
0
 
C++
ava
IValdemar | 26.01.2013, 15:49
Есть следующий код

int mas[10];

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

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

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

В общем интересно как это все организовано. Если это можно посмотреть где-нибудь в библиотеках или еще где-то, прошу написать.
Ответы (6)
ava
volatile | 26.01.2013, 17:26 #
Цитата (IValdemar @  26.1.2013,  14:49 findReferencedText)
тут 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*;
Поэтому некоторым кажецца что это одно и тоже

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

int* somePtr = mas;

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

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

Если где-то про это можно почитать киньте ссылочку, а то я про такое первый раз слышу.
ava
volatile | 26.01.2013, 19:51 #
Цитата (IValdemar @  26.1.2013,  18:18 findReferencedText)
Значит int[10] преобразуется в тип int*.

Это я правильно понял?

да

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

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

где почитать именно про это - поискать надо. Может кто кинет ссылку...
ava
IValdemar | 26.01.2013, 21:03 #
Кажется примерно разобрался

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;

Такая запись будет эквивалентна, правильно?
ava
volatile | 26.01.2013, 23:27 #
Цитата (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, в остальном мыслите правильно.

Добавлено позднее:

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

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

ava
IValdemar | 27.01.2013, 14:03 #
volatile, спасибо, я думаю дальше разберусь.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить