LINUX.ORG.RU

С++ gcc ссылка на массив


0

0

Пытаюсь изучить С++ , столкнулся с проблемой. как создать ссылку на массив? Пробовал так:

int mas[]= {1,2,3,4,5,6,7,8,9,10}; int *&rmas = mas;

Но gcc на это ругается: ex3.cpp:14: error: invalid initialization of non-const reference of type 'int*&' from a temporary of type 'int*'

Поскольку имя массива есть не что иное как указатель на его первый элемент(?), попробовал сделать это через промежуточный указатель int* ;

int mas[]= {1,2,3,4,5,6,7,8,9,10}; int *p; p = mas; int *&rmas = p;

Некрасиво но вроде работает.

Не пойму в чем проблема с первым вариантом?

anonymous

Вот это тоже работает, только вот не пойму почему int *const &rmas = mas;

int *const &rmas - это же вроде ссылка на указатель на константый объект? Но присвоение по rmas работает!

Или я ошибаюсь? И это ссылка на константый указатель на обьект?

Обясните пожалуйста.

anonymous
()
Ответ на: комментарий от cvv

Не знаю, я об этом в первом посте написал. На вариант : int *rmas = &mas;

gcc реагирует так:

ex3.cpp:14: error: cannot convert `int (*)[10]' to `int*' in initialization

anonymous
()
Ответ на: комментарий от anonymous

могу сказать что ты ктомуже ещё не знаеш "С".

тебе надо было яву осваивать, там нету указазателей. там только ссылки

лисп насколько я понимаю тебе в этой жизни не осилить

а мож тебе питон понравится?

cvv ★★★★★
()
Ответ на: комментарий от ananas

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

Кстати ваш вариант у меня тоже не работает.

Тут дело в принципе , посокльку это мне нужно не дл решения какой-то конкретной задачи а для создания пресдтавления о С++.

Самое интересное что в книге автора Подбельского приведены примеры аналогичный первому приведенному мной выражению.

Может дело в gcc(3.4.4)?

anonymous
()
Ответ на: комментарий от anonymous

ananas подразумевал

int *rmas = mas;

хотя лучше вот так:

int* const rmas = mas;

в конкретной ситуации rmas полностью эквивалентно ссылке, хотя если честно то синтаксис обьявления ссылок не использован.

cvv ★★★★★
()

int * rmas = &mas[0];

Хотя без определения и так первый адрес подставляется.

Anoxemian ★★★★★
()
Ответ на: комментарий от cvv

Это константный-указател, функционально в данном случае может и одно и тоже. Но дело не в этом.

Выражение типа int *const &rmas = mas; больше похоже на правду, осталось только понять почему компиялтор требует константу

anonymous
()
Ответ на: комментарий от anonymous

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

cvv ★★★★★
()

[честно предупреждаю - учебников по Си++ не читал уже лет 10]

> Не пойму в чем проблема с первым вариантом?

Если я правильно понимаю, то в выражении:

int mas[]= {1,2,3,4,5,6,7,8,9,10}; int *&rmas = mas;

rmas пытается сослаться на не-lvalue, т.е. переменную, которой не существует (практически mas - это результат вычисления выражения). Поэтому для инициализации rmas компилятор создает временную переменную, о чем и сообщает. Временная переменная инициализируется преобразованным к `int *' значением mas.

Во втором примере работу компилятора ты сделал вручную :)

Вообще-то ссылки на массив в Си++ не имеют смысла. Если очень хочется их определять, попробуй старый трюк:

typedef int intarr[10];

intarr a;

intarr& t = a;

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Спасибо tailgunnerб, спасибо остальным участникам, за помошь. Странно все таки что Страуструп предлагает в своей книге такие упражнения, как описание ссылки на массив из 10 целых.

anonymous
()
Ответ на: комментарий от anonymous

> Страуструп предлагает в своей книге такие упражнения, как описание ссылки на массив из 10 целых.

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

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> В учебниках по Си предлагают ужасы вроде "напишите прототип функции, возвращающей функцию, принимающую как аргумент указатель на функцию".

Фигня. Вот порядок &* при объявлении переменной в с++ меня порой сбивает с толку. Книжек по с++ не читал уже лет 5, последняя была страуструп 3-я редакция на английском. Как работать с STL выяснял по его сорцам, вот где подлинный ужас...

Casus ★★★★★
()
Ответ на: комментарий от Casus

>> В учебниках по Си предлагают ужасы вроде "напишите прототип функции, возвращающей функцию, принимающую как аргумент указатель на функцию".

>Фигня.

Ты крут немеряно ;)

> Как работать с STL выяснял по его сорцам

Ты воистину крут немеряно 8) Это всё равно, что учить язык по исходникам компилятора.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>> Как работать с STL выяснял по его сорцам

>Ты воистину крут немеряно 8) Это всё равно, что учить язык по исходникам компилятора.

не всегда есть альтернативы

cvv ★★★★★
()
Ответ на: комментарий от cvv

>>> Как работать с STL выяснял по его сорцам

>>Ты воистину крут немеряно 8) Это всё равно, что учить язык по исходникам компилятора.

>не всегда есть альтернативы

Это последнее средство. Начинать надо с примеров в поставке компилятора :)

tailgunner ★★★★★
()

Вообще то по моему ссылка на масив из 10 элеметов будет выглядеть так:
int (& rmas)[10] = mas;

platerx
()
Ответ на: комментарий от tailgunner

> Ты крут немеряно ;)

Я просто на Си с 89г пишу... ,)

> Ты воистину крут немеряно 8) Это всё равно, что учить язык по исходникам компилятора.

Я ж не буратино сам себе, я начинаю всегда с документации. Но иногда надо понять, как же оно на самом деле. В некоторых случаях, исходный код выражается понятнее документации. Особенно, если учесть, что там в комментариях есть порой полезные замечания.

Casus ★★★★★
()
Ответ на: комментарий от anonymous

> int *const &rmas - это же вроде ссылка на указатель на константый объект? Но присвоение по rmas работает!

> Или я ошибаюсь? И это ссылка на константый указатель на обьект? именно. Дело в том, что int mas[] - это и есть константный указатель (опуская тонкости). Это означает запрет на модификацию mas (как такового, а не то, на что он указывает!). Ты же хочешь создать неконстантную ссылку на константный объект. А это нельзяю.

Так понятнее?

gpg
()
Ответ на: комментарий от Casus

>> Ты крут немеряно ;)

> Я просто на Си с 89г пишу... ,)

Я с 90-го, но всё равно делаю такие вещи typedef'ами.

>> Ты воистину крут немеряно 8) Это всё равно, что учить язык по исходникам компилятора.

>Я ж не буратино сам себе, я начинаю всегда с документации. Но иногда надо понять, как же оно на самом деле.

Ну, тогда это уже называется не "как работать с", а "как оно работает внутри" ;)

tailgunner ★★★★★
()
Ответ на: комментарий от gpg

Да спасибо. Можно написать и так. int arr[10]; int &ref = *arr; Тоже работает.

Короче я в восторге от С++ язык огромных возможностей: char * test = "blablabal"; бррр .. Я коненчо понимаю что совместимость вещь хорошая но надо же писать про это во всех книгах, а не только в некоторых.

Также всем изучающим С++ по книгам Страуструпа советовал бы найти последнюю редакцию.

anonymous
()
Ответ на: комментарий от tailgunner

> Ну, тогда это уже называется не "как работать с", а "как оно работает внутри" ;)

Именно для того, чтобы знать "как работать с", приходится смотреть "как оно работает внутри". С STL это ж просто ужас какой-то... Иногда приходится смотреть, чтобы понять трудоёмкость алгоритма, иногда из-за нехватки слов в документации.

Casus ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.