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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
#1

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

10.08.2013, 13:15. Просмотров 1174. Ответов 32
Метки нет (Все метки)

Объясните, пожалуйста, каким образом в 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++
Здрасти. Как мне сделать указатель на массив: string stud= {{&quot;49000&quot;, &quot;Eddy&quot;, &quot;Vedder&quot;, &quot;dzienne&quot;, &quot;19&quot;}, {&quot;49001&quot;, &quot;Roger&quot;,...

Как объявить указатель на массив? - C++
Читаю книгу С.Прата, наткнулся на это: short (*pas) = &amp;tell; // pas указывает на массив из 20 элементов short Если опустить круглые...

Как передать массив через указатель? - C++
Народ, такая проблема: при передаче в функцию массива через указатель, вся информация теряется и замещается бредом каким то, вот выдержка...

Как заставить массив превратиться в указатель? - C++
Привет! Как известно, при передаче массива в функцию он превращается в указатель. Также хорошо известной особенностью C++ является...

Как обьявить указатель на двумерный массив? - C++
обьясните на примере как обьявить указатель на двумерный массив и потом обращаться к элементам через указатель

Как правильно передать массив через указатель? - C++
#pragma once #include &lt;vector&gt; class TOMathModel { public: TOMathModel(void); ~TOMathModel(void);

Указатель на статический массив как параметр шаблона - C++
Добрый день. Необходимо параметр шаблона сделать указателем и передавать в него указатель на статический массив: template&lt;size_t...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
10.08.2013, 13:22     Указатель, как массив #2
Цитата Сообщение от Erjay Посмотреть сообщение
pType
возможно это указатель на массив, виделенный в динамической п.
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
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.08.2013, 13:36     Указатель, как массив #5
pType -- указатель. Offset -- смещение на n-количество байт. * -- возвращает элемент в памяти, адрес которого pType + offset
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
10.08.2013, 15:27     Указатель, как массив #6
Цитата Сообщение от Erjay Посмотреть сообщение
И как это понять?
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
mr_Skat
7 / 7 / 1
Регистрация: 11.08.2013
Сообщений: 30
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].
Убежденный
Системный программист
Эксперт С++
15298 / 6930 / 1096
Регистрация: 02.05.2013
Сообщений: 11,340
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,495
Записей в блоге: 4
11.08.2013, 14:40     Указатель, как массив #9
Цитата Сообщение от Erjay Посмотреть сообщение
Объясните, пожалуйста, каким образом в 10-ой строке указатель pType ведет себя как массив?
Массив это встроенный в язык обобщённый тип. Указатель тоже. Они могут быть любого типа (совместимость не полная, так как не может быть, например, массивов void, а указатели на void, - могут)) и оба поддерживают индексное обращение. Имя массива преобразуется к указателю на первый элемент в выражениях, где ожидается указатель. В 10 строке указатель на начало массива индексируется также, как это происходило бы с именем массива. В этом смысле можно говорить о похожем "поведении". А вообще, согласен с :
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,495
Записей в блоге: 4
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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 01:14     Указатель, как массив #12
IGPIGP, мы говорим о разных вещах. Имя массива ни в коем случае не является указателем. Оно лишь может быть не явно преобразовано в указатель. Я же говорю о параметрах функции.
void f( T [] ) == void f( T * )
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,495
Записей в блоге: 4
12.08.2013, 01:54     Указатель, как массив #13
Цитата Сообщение от Toshkarik Посмотреть сообщение
мы говорим о разных вещах.
А-а, понял. Вы имели в виду, что в объявленном как массив параметре фактически указатель.
Что же, может для [TC] с вопросом о "поведении" будет интересно увидеть разные примеры. И то, что имя массива преобразуется к значению указателя на первый элемент, когда это правостороннее значение, тоже пригодится.

Добавлено через 12 минут
Пример Убежденный похоже о том, что частенько спрашивают. То есть, фактически: Почему размер массива делённый на размер типа не равен размерности массива? При этом делят размер указателя.
И он же и имел в виду, что фактически sizeof будет применён к указателю. С соответствующим результатом.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 11:05     Указатель, как массив
Еще ссылки по теме:

Как записать указатель со строковым литералом в массив - C++
Всем привет, что - то застрял на такой вот штуке. (Стыдно... =() char *str = &quot;String Literal&quot;; printf(&quot;%s&quot;, str); str = 't'; ...

Как вернуть из функции указатель на массив элементов класса - C++
Здравствуйте! Возникла такая проблема. Есть класс, созданный мной. Функция формирует массив элементов этого класса (массив...

Как функция возвращает указатель на структуру в массив указателей - C++
Друзья, следующий вопрос, у меня есть функция, которая: создает указатель на структуру-&gt; выделяет память-&gt; заполняет из файла-&gt; и...

Возвращаемое значение функции - указатель на массив. КАК это записать? - C++
Функция заполняет массив. например (кусок проги) .... int mas; int fun() { заполнила массив

Используя указатель, как параметр цикла, распечатать массив с конца, пропуская элементы, кратные 3 - C++
Создать целочисленный массив из 10 элементов. Используя указатель в качестве параметра цикла: распечатать массив с конца, пропуская...


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

Или воспользуйтесь поиском по форуму:
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
Yandex
Объявления
12.08.2013, 11:05     Указатель, как массив
Ответ Создать тему
Опции темы

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