Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

Ссылка на Массив - C++/CLI WinForms
Ребят, уже задавал вопрос, но ответа так и не получил. Вопрос кажется простым, но на деле ничего не выходит. Ковыряюсь уже не первый день. ...

Ссылка на массив - Java SE
В одном классе есть такой массив: private float array1; в другом классе нужно его обработать. Как обратиться к нему из второго класса? ...

19
Humanitis
175 / 167 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 09:39 #2
Разницы в твоих кодах нету.
А ссылку на массив надо кажется так объявлять
C++
1
int *& arrayref;
1
Monte-Cristo
2794 / 1380 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
03.05.2009, 11:21 #3
зачем это вообще надо? используйте указатели! тем более, что имя массива - указатель на первый элемент! работы меньше, а следовательно и проще использовать.
0
Humanitis
175 / 167 / 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 указатель на другой массив
...
}
...
0
Monte-Cristo
2794 / 1380 / 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;
}
0
Humanitis
175 / 167 / 6
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 13:39 #6
Ну тот же.И что?
0
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
03.05.2009, 17:00  [ТС] #7
Цитата Сообщение от Humanitis Посмотреть сообщение
Разницы в твоих кодах нету.
А ссылку на массив надо кажется так объявлять
C++
1
int *& arrayref;
Так мои объявления неверны?
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
зачем это вообще надо? используйте указатели! тем более, что имя массива - указатель на первый элемент! работы меньше, а следовательно и проще использовать.
Учусь по книге,поэтому.
0
Алямбр
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, что нам и требовалось.
0
Croessmah
Ушел
13770 / 8020 / 924
Регистрация: 27.09.2012
Сообщений: 19,747
Записей в блоге: 3
Завершенные тесты: 1
20.07.2015, 21:47 #9
Во-первых, это
Цитата Сообщение от Алямбр Посмотреть сообщение
int * masl = mas;//ссылка на массив
указатель на что-то, в данном случае на первый элемент массива. Но это не ссылка на массив.
Во-вторых, как бы 6 лет уже прошло...
1
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
20.07.2015, 21:50 #10
Алямбр, то, что ты написал - не ссылка, а указатель. Да и дата поста тебя не смущает?

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

Не по теме:

Croessmah, ах ты ж...

0
Croessmah
Ушел
13770 / 8020 / 924
Регистрация: 27.09.2012
Сообщений: 19,747
Записей в блоге: 3
Завершенные тесты: 1
20.07.2015, 21:53 #11

Не по теме:

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



кстати, ссылка на массив:
C++
1
2
int arr[10] ;
int (&link)[10]   = arr ;
1
Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
20.07.2015, 22:23 #12
Я понимаю, что по синтаксису это указатель, просто сам решал недавно эту задачу и это было единственным решением, которое я нашёл и которое не выходит за рамки определений.
Цитата Сообщение от Croessmah Посмотреть сообщение
кстати, ссылка на массив:
А за это большое спасибо.
P.s. Дата датой, но проблема, я думаю, имеет актуальность, раз у меня она возникла.
0
Croessmah
Ушел
13770 / 8020 / 924
Регистрация: 27.09.2012
Сообщений: 19,747
Записей в блоге: 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 ;
0
hoggy
6813 / 3001 / 516
Регистрация: 15.11.2014
Сообщений: 6,795
Завершенные тесты: 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 ( а не на массив таких объектов)

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

однако есть разница между указателем на первый элемент массива, и указателем на сам массив.
последнее хранит знание о размерностях массива.
4
Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
20.07.2015, 22:59 #15
А почему работает такое присваивание:
C++ (Qt)
1
masl[n]=i;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2015, 22:59
Привет! Вот еще темы с ответами:

Ссылка на массив - Visual Basic
Приветствую. Делаю библиотеку dll. Есть функция Public Function SetListText(Word As Object, ByRef TextList() As String) As Integer ...

Ссылка на байтовый массив - C#
Уважаемые форумчане , подскажите как правильно будет передать адрес байтовой переменной например на Си это выглядит так char...

Ссылка на массив в виде byte! - Delphi
Необходимо(сильно необходимо! в кратчайшие прям сроки:( ) передать в функцию ,как входной параметр ссылку на массив, желательно...

DataGridView ссылка на весь массив - Visual C++
Здравствуйте, такой вопрос, есть ли ссылка на весь массив строк содержащийся в DataGridView, или нужно обязательно, для того, чтобы его...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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