Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.73
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Ссылка на массив - C++

03.05.2009, 09:24. Просмотров 7444. Ответов 19
Метки нет (Все метки)

Необходимо объявить ссылку на массив из нескольких целых.Что представляет из себя такая ссылка и как правильно её объявить?как может ссылка указывать на весь массив,не будет ли она содержать адрес первого элемента?Я пробовал объявлять так
C++
1
2
int array[10];
int &arrayref=*array;
или так
C++
1
2
int array[10];
int &arrayref=array[0];
В чём принципиальная разница этих объявлений,ведь ссылка возвратит один и тот же адрес?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2009, 09:24     Ссылка на массив
Посмотрите здесь:

Ссылка на массив и внутренний массив - C++
Подскажите что делать. Вхожу в функцию с указателем на матрицу void invMatr ( float *a, float e) { в функции внутренняя матрица...

Ссылка на двумерный массив - C++
Здравствуйте. Объясните досконально это выражение: int (&ref1);

Массив-ссылка на некоторые элементы другого массива - C++
У меня тут возникла идея. Есть большой двумерный массив, но не все строки этой матрицы нам нужны. Индексы нужных строк записаны в другой...

Ссылка на массив в качестве возвращаемого результата функции - C++
Уважаемые форумчане. Нужна Ваша помощь. template<typename T, int N> class test { public: test() { a =...

Не найдена ссылка - C++
В программе использую WinAPI, как надо подключаю заголовочныq файл #include <windows.h> Далее пишу функцию для рисования линий ...

Указатель и ссылка - C++
В общем вопрос достаточно простой, в чём разница указателя и сылки? С одной стороны указатель это отдельный тип, отдельная ячейка в...

Ссылка на указатель - C++
Привет всем, пишу класс реализующий стек, объявил вершину стека как приватный элемент. Написал метод Push - который должен добавить в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 09:39     Ссылка на массив #2
Разницы в твоих кодах нету.
А ссылку на массив надо кажется так объявлять
C++
1
int *& arrayref;
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
03.05.2009, 11:21     Ссылка на массив #3
зачем это вообще надо? используйте указатели! тем более, что имя массива - указатель на первый элемент! работы меньше, а следовательно и проще использовать.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 12:10     Ссылка на массив #4
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
зачем это вообще надо?
C++
1
2
3
4
5
6
7
8
9
int* foo=new int[20];
...
void Foo(int*& arr)
{
   if (чего-то там)
      arr=new int[20];//теперь в foo указатель на другой массив
...
}
...
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
03.05.2009, 12:49     Ссылка на массив #5
тот же результат...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int* Foo(int *a)
{
    a = new int[5];
    return a;
}
 
int main()
{
    int *a = new int[10];
    a = Foo(a);
    
    return 0;
}
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 13:39     Ссылка на массив #6
Ну тот же.И что?
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
03.05.2009, 17:00  [ТС]     Ссылка на массив #7
Цитата Сообщение от Humanitis Посмотреть сообщение
Разницы в твоих кодах нету.
А ссылку на массив надо кажется так объявлять
C++
1
int *& arrayref;
Так мои объявления неверны?
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
зачем это вообще надо? используйте указатели! тем более, что имя массива - указатель на первый элемент! работы меньше, а следовательно и проще использовать.
Учусь по книге,поэтому.
Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
20.07.2015, 21:27     Ссылка на массив #8
"Ссылка - альтернативное имя объекта" по Страуструпу, так что
C++ (Qt)
1
2
int mas[10];
    int * masl = mas;//ссылка на массив
Можно устроить проверку
C++ (Qt)
1
2
if (mas == masl)
        cout << "YES!\n";
Так как два имени ссылаются на один и тот же объект, то masl является ссылкой на массив mas, что нам и требовалось.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
20.07.2015, 21:47     Ссылка на массив #9
Во-первых, это
Цитата Сообщение от Алямбр Посмотреть сообщение
int * masl = mas;//ссылка на массив
указатель на что-то, в данном случае на первый элемент массива. Но это не ссылка на массив.
Во-вторых, как бы 6 лет уже прошло...
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
20.07.2015, 21:50     Ссылка на массив #10
Алямбр, то, что ты написал - не ссылка, а указатель. Да и дата поста тебя не смущает?

Добавлено через 32 секунды

Не по теме:

Croessmah, ах ты ж...

Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
20.07.2015, 21:53     Ссылка на массив #11

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Croessmah, ах ты ж...
да, да, да...



кстати, ссылка на массив:
C++
1
2
int arr[10] ;
int (&link)[10]   = arr ;
Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
20.07.2015, 22:23     Ссылка на массив #12
Я понимаю, что по синтаксису это указатель, просто сам решал недавно эту задачу и это было единственным решением, которое я нашёл и которое не выходит за рамки определений.
Цитата Сообщение от Croessmah Посмотреть сообщение
кстати, ссылка на массив:
А за это большое спасибо.
P.s. Дата датой, но проблема, я думаю, имеет актуальность, раз у меня она возникла.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
20.07.2015, 22:36     Ссылка на массив #13
Цитата Сообщение от Алямбр Посмотреть сообщение
которое я нашёл и которое не выходит за рамки определений.
как раз выходит. Согласно стандарта, массив кастуется к указателю на первый элемент, так что у Вас даже не указатель на массив, а указатель на первый элемент.
4.2 Array-to-pointer conversion
1. An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.
Указатель на массив выглядит как-то так:
C++
1
2
int arr[10] ;
int (*link)[10] = &arr ;
hoggy
6462 / 2660 / 460
Регистрация: 15.11.2014
Сообщений: 5,850
Завершенные тесты: 1
20.07.2015, 22:55     Ссылка на массив #14
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
зачем это вообще надо?
ссылки на массив "помнят" свою природу: знают типы и размерности:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template<typename T, size_t N>
void foo(  const T (&arr)[N] )
{
   std::cout<<"'массив из "<< N<< "элементов\n";
}
 
int main()
{
     int a[] ={1,3,4,5,6};
     float b[] ={1,3,4,5,6};
 
    foo(a); //<--- не нужно указывать размер массива
     // он будет вычислен автоматически
 
 
   foo(b);
}
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
используйте указатели!
а вот указатели не знают, на что они точно указывают.
и поэтому, менее надежные.

а функции, написанные с их помощью не дают никаких гарантий,
и не способны обнаружить ошибку (например - выход за пределы диапазона массива).

Добавлено через 3 минуты
Цитата Сообщение от dvano Посмотреть сообщение
Чем отличается от int *link = arr?
здесь link - это обычный сырой указатель,
который указывает на объект типа int ( а не на массив таких объектов)

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

однако есть разница между указателем на первый элемент массива, и указателем на сам массив.
последнее хранит знание о размерностях массива.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2015, 22:59     Ссылка на массив
Еще ссылки по теме:

Ссылка на указатель - C++
Задам, скорее всего, глупый вопрос, однако хотелось бы разобраться. // ... { int *ptr = new int; int &amp;x = *ptr; } ...

Ссылка на ссылку - C++
Можно ли говорить, что t это ссылка на ссылку? int y=2; int &amp;q=y; int&amp; t = q;

Указатель и ссылка - C++
Помогите понять, немного запутался. #include&lt;iostream&gt; using namespace std; void ch1 (int *pa1); int main() {

Ссылка на структуру - C++
Рассматривал пример из книги Праты. Раздел про ссылки на структуры. В книжке был приведён пример, код примера можно увидеть ниже. У меня...

Указатель и ссылка - C++
Почему выгодней использовать указатель а не ссылку при использовании массивов?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
20.07.2015, 22:59     Ссылка на массив #15
А почему работает такое присваивание:
C++ (Qt)
1
masl[n]=i;
Yandex
Объявления
20.07.2015, 22:59     Ссылка на массив
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru