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

Указатель, как массив - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
10.08.2013, 13:15     Указатель, как массив #1
Объясните, пожалуйста, каким образом в 10-ой строке указатель pType ведет себя как массив?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T>  // declare the template and the parameter
class Array            // the class being parameterized
{
public:
    Array(int itsSize = DefaultSize);
    Array(const Array &rhs);
    ~Array() { delete [] pType; }
 
    Array& operator=(const Array&);
    T& operator[](int offSet) { return pType[offSet]; }
    const T& operator[](int offSet) const
        { return pType[offSet]; }
    int GetSize() const { return itsSize; }
 
    // friend function
    template <class T>
    friend ostream& operator<< (ostream&, const Array<T>&);
 
private:
    T *pType;
    int  itsSize;
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2013, 13:15     Указатель, как массив
Посмотрите здесь:

Как передать массив через указатель? C++
Как обьявить указатель на двумерный массив? C++
Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив. C++
Указатель на статический массив как параметр шаблона C++
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
10.08.2013, 13:22     Указатель, как массив #2
Цитата Сообщение от Erjay Посмотреть сообщение
pType
возможно это указатель на массив, виделенный в динамической п.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.08.2013, 13:31     Указатель, как массив #3
Цитата Сообщение от Erjay Посмотреть сообщение
pType[offSet]
читай *(pType + offset)
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
10.08.2013, 13:33  [ТС]     Указатель, как массив #4
Цитата Сообщение от coloc Посмотреть сообщение
читай *(pType + offset)
И как это понять?
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.08.2013, 13:36     Указатель, как массив #5
pType -- указатель. Offset -- смещение на n-количество байт. * -- возвращает элемент в памяти, адрес которого pType + offset
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
10.08.2013, 15:27     Указатель, как массив #6
Цитата Сообщение от Erjay Посмотреть сообщение
И как это понять?
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
mr_Skat
 Аватар для mr_Skat
6 / 6 / 1
Регистрация: 11.08.2013
Сообщений: 29
11.08.2013, 14:11     Указатель, как массив #7
Указатель как массив.
1 Создание массива на основе указателя :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   # include <iostream>
       using namespace std;
 
       int main () {
            const int size = 10;
            int *arrPtr = new int [size];
            int i;
 
            cout << "Input array :\n";
            for (i=0; i<size; i++) {
               cin >> *(arrPtr+i);
            }
 
            cout << "Array : ";
            for (i=0; i<size; i++) {
                cout << *(arrPtr+i) << " ";
            }
            cout << "\n";
 
            delete [] arrPtr;
            return 0;
}
2 Строка 10: T& operator[](int offSet) { return pType[offSet]; } это перегрузка операции индексирования, специальная функция для класса позволяющая выполнять обычние операции из абстрактными типами данных.
Она принемает знечение идекс int offSet и возращает значение pType[offSet].
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 1
11.08.2013, 14:22     Указатель, как массив #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Когда указатель ведет себя как массив - это еще полбеды.
Хуже, когда массив начинает притворяться указателем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
#define array_size(a) (sizeof (a) / sizeof (a[0]))
 
void show_array(int Array[])
{
    for (size_t i = 0; i < array_size(Array); ++i)
    {
        std::cout << Array[i];
    }
 
    std::cout << std::endl;
}
 
int main()
{
    int Array[] = {0,1,2,3,4,5,6,7,8,9};
    show_array(Array);
    return 0;
}
Вывод:
>0
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,696
Записей в блоге: 3
11.08.2013, 14:40     Указатель, как массив #9
Цитата Сообщение от Erjay Посмотреть сообщение
Объясните, пожалуйста, каким образом в 10-ой строке указатель pType ведет себя как массив?
Массив это встроенный в язык обобщённый тип. Указатель тоже. Они могут быть любого типа (совместимость не полная, так как не может быть, например, массивов void, а указатели на void, - могут)) и оба поддерживают индексное обращение. Имя массива преобразуется к указателю на первый элемент в выражениях, где ожидается указатель. В 10 строке указатель на начало массива индексируется также, как это происходило бы с именем массива. В этом смысле можно говорить о похожем "поведении". А вообще, согласен с :
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2013, 00:28     Указатель, как массив #10
Убежденный, так он и не притворяется. Это и есть отдельный указатель. В параметрах функции ( T [] ) эквивалентно ( T * ). То есть такой код вполне валидный:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void f( int Array[]) {
   ++Array;
   --Array;
}
 
int main() {
   int Array[ 10 ] = {};
   
   f( Array );
   
   return 0;
}
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,696
Записей в блоге: 3
12.08.2013, 01:11     Указатель, как массив #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Убежденный, так он и не притворяется. Это и есть отдельный указатель.
Это все-таки не обыкновенный указатель.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main()
{
int a[] = {1, 2, 3, 4};
int* pia = ++a;//: error C2105: для "++" требуется левостороннее значение
cout<<*pia;
cout<<endl;
cin.ignore();
cin.get();
return 0;
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2013, 01:14     Указатель, как массив #12
IGPIGP, мы говорим о разных вещах. Имя массива ни в коем случае не является указателем. Оно лишь может быть не явно преобразовано в указатель. Я же говорю о параметрах функции.
void f( T [] ) == void f( T * )
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,696
Записей в блоге: 3
12.08.2013, 01:54     Указатель, как массив #13
Цитата Сообщение от Toshkarik Посмотреть сообщение
мы говорим о разных вещах.
А-а, понял. Вы имели в виду, что в объявленном как массив параметре фактически указатель.
Что же, может для [TC] с вопросом о "поведении" будет интересно увидеть разные примеры. И то, что имя массива преобразуется к значению указателя на первый элемент, когда это правостороннее значение, тоже пригодится.

Добавлено через 12 минут
Пример Убежденный похоже о том, что частенько спрашивают. То есть, фактически: Почему размер массива делённый на размер типа не равен размерности массива? При этом делят размер указателя.
И он же и имел в виду, что фактически sizeof будет применён к указателю. С соответствующим результатом.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.08.2013, 10:21     Указатель, как массив #14
Если всё же хочется передавать массив в функцию и иметь возможность вычислять при этом размер, можно воспользоваться шаблонами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template <int size>
void f( int (&a)[size] )
{
    std::cout << sizeof(a)/sizeof(*a) << std::endl;
}
 
int main() {
    
    int a[] = {1,2};
    int b[] = {1,2,3};
    int c[] = {1,2,3,4,5};
    
    f(a);
    f(b);
    f(c);
    
    return 0;
}
https://ideone.com/Zx7wFH
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2013, 11:05     Указатель, как массив #15
Tulosba, Смысла тогда нет вычислять размер А так можно вообще полностью шаблонную функцию сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
 
template< typename T, const std::size_t size >
void print( T ( &array )[ size ]) {
   for ( const T &current : array )
      std::cout << current << ' ';
   
   std::cout << std::endl;
}
 
int main() {
   int a[ 5 ] = { 1, 2, 3, 4, 5 };
   double b[ 6 ] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };
   const char *c[] = { "first", "second", "third" };
   
   print( a );
   print( b );
   print( c );
   
   return 0;
}
Цитата Сообщение от IGPIGP Посмотреть сообщение
И он же и имел в виду, что фактически sizeof будет применён к указателю.
Как мне кажется, он как раз говорил о том, что ( int Array[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.08.2013, 11:41     Указатель, как массив #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
Смысла тогда нет вычислять размер
Ну, хорошо, не вычислять, а знать
Toshkarik, между прочим, диапазонный for
C++
1
for ( const T &current : array )
как раз использует тот же подход с шаблоном через std::begin()/end()
Jupiter
12.08.2013, 12:10
  #17

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
C++
1
template< typename T, const std::size_t size >
а когда size будет не константой при таком
C++
1
template< typename T, std::size_t size >
коде?

Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2013, 12:11     Указатель, как массив #18
Jupiter, никогда. Это просто для читаемости.
Jupiter
12.08.2013, 12:12
  #19

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
никогда. Это просто для читаемости.
масло масляное

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 12:59     Указатель, как массив
Еще ссылки по теме:

C++ Как сделать указатель на массив
C++ Как объявить указатель на массив через typedef и как инициализировать такой тип
C++ Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 1
12.08.2013, 12:59     Указатель, как массив #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как мне кажется, он как раз говорил о том, что ( int Array[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель.
Все верно подмечено. Я говорил о том, что плохо, когда массив притворяется указателем, хотя в
приведенном примере он и является указателем, просто в параметрах функции выглядит как массив.
Это может сбить с толку и привести к ошибкам. Например, когда используются шаблоны и
истинный тип скрыт.
Yandex
Объявления
12.08.2013, 12:59     Указатель, как массив
Ответ Создать тему
Опции темы

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