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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.73
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
03.05.2009, 09:24     Ссылка на массив #1
Необходимо объявить ссылку на массив из нескольких целых.Что представляет из себя такая ссылка и как правильно её объявить?как может ссылка указывать на весь массив,не будет ли она содержать адрес первого элемента?Я пробовал объявлять так
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++ Не найдена ссылка
Ссылка на структуру C++
C++ Ссылка на ссылку
C++ постоянная ссылка
C++ Массив-ссылка на некоторые элементы другого массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 09:39     Ссылка на массив #2
Разницы в твоих кодах нету.
А ссылку на массив надо кажется так объявлять
C++
1
int *& arrayref;
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
03.05.2009, 11:21     Ссылка на массив #3
зачем это вообще надо? используйте указатели! тем более, что имя массива - указатель на первый элемент! работы меньше, а следовательно и проще использовать.
Humanitis
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 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
 Аватар для Monte-Cristo
2805 / 1370 / 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
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 12.01.2009
Сообщений: 430
03.05.2009, 13:39     Ссылка на массив #6
Ну тот же.И что?
#pragma
Временно недоступен
 Аватар для #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
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
20.07.2015, 21:47     Ссылка на массив #9
Во-первых, это
Цитата Сообщение от Алямбр Посмотреть сообщение
int * masl = mas;//ссылка на массив
указатель на что-то, в данном случае на первый элемент массива. Но это не ссылка на массив.
Во-вторых, как бы 6 лет уже прошло...
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.07.2015, 21:50     Ссылка на массив #10
Алямбр, то, что ты написал - не ссылка, а указатель. Да и дата поста тебя не смущает?

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

Не по теме:

Croessmah, ах ты ж...

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 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
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 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 ( а не на массив таких объектов)

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

однако есть разница между указателем на первый элемент массива, и указателем на сам массив.
последнее хранит знание о размерностях массива.
Алямбр
 Аватар для Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
20.07.2015, 22:59     Ссылка на массив #15
А почему работает такое присваивание:
C++ (Qt)
1
masl[n]=i;
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
20.07.2015, 23:01     Ссылка на массив #16
Цитата Сообщение от dvano Посмотреть сообщение
Чем отличается от int *link = arr?
тем, что это указатель на первый элемент массива, а не указатель на массив. Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
 
int main()
{
    int arr[10] ;
    
    int * ptr_first_element = arr ;
    int (*ptr_array)[10] = &arr ;
   
    
    std::cout << 
        "sizeof(ptr_first_element): " <<
        sizeof(ptr_first_element) << 
        "\nsizeof(*ptr_first_element): " <<
        sizeof(*ptr_first_element) << 
        std::endl ;
    
    
    std::cout <<
        "sizeof(ptr_array): " <<
        sizeof(ptr_array) << 
        "\nsizeof(*ptr_array): " <<
        sizeof(*ptr_array) << 
        std::endl ;
}
http://rextester.com/GOFR4327


Собственно, hoggy уже всё написал
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
21.07.2015, 10:30     Ссылка на массив #17
Цитата Сообщение от Алямбр Посмотреть сообщение
А почему работает такое присваивание:
C++
1
masl[n]=i;
Потому что это аналог
C++
1
*(masl + n) = i;
masl указывает куда-то внутрь области памяти данной программы. И пока мы не выйдем из этой области у нас n может быть вообще любой. Хоть через этот masl соседний массив заполняй. С другой стороны, изменив таким образом что-то ненужное, можно нарушить работу программы. поэтому указатели это очень мощная вещь, но и крайне опасная.
Алямбр
 Аватар для Алямбр
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 8
21.07.2015, 11:14     Ссылка на массив #18
Цитата Сообщение от SatanaXIII Посмотреть сообщение
masl указывает куда-то внутрь области памяти данной программы. И пока мы не выйдем из этой области у нас n может быть вообще любой. Хоть через этот masl соседний массив заполняй. С другой стороны, изменив таким образом что-то ненужное, можно нарушить работу программы. поэтому указатели это очень мощная вещь, но и крайне опасная.
То есть, ссылкой за пределы массива выйти нельзя, а указателем можно?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
21.07.2015, 11:38     Ссылка на массив #19
Цитата Сообщение от Алямбр Посмотреть сообщение
То есть, ссылкой за пределы массива выйти нельзя, а указателем можно?
Да при желании-то все можно:
C++
1
2
int &am = mas[0];
*( &am + n ) = i;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 08:39     Ссылка на массив
Еще ссылки по теме:

C++ Ссылка на двумерный массив
C++ Ссылка на массив и внутренний массив
C++ Ссылка в функции

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,866
Записей в блоге: 2
Завершенные тесты: 1
23.07.2015, 08:39     Ссылка на массив #20
То есть, ссылкой за пределы массива выйти нельзя, а указателем можно?
Ссылка "безопаснее" указателя только в том, что она не может быть не инициализирована, но она так же, как и указатель, может быть не валидной.
Yandex
Объявления
23.07.2015, 08:39     Ссылка на массив
Ответ Создать тему
Опции темы

Текущее время: 17:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru