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

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

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

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

10.08.2013, 13:15. Просмотров 1173. Ответов 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...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 12:11     Указатель, как массив #18
Jupiter, никогда. Это просто для читаемости.
Jupiter
12.08.2013, 12:12
  #19

Не по теме:

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

Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
12.08.2013, 12:59     Указатель, как массив #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как мне кажется, он как раз говорил о том, что ( int Array[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель.
Все верно подмечено. Я говорил о том, что плохо, когда массив притворяется указателем, хотя в
приведенном примере он и является указателем, просто в параметрах функции выглядит как массив.
Это может сбить с толку и привести к ошибкам. Например, когда используются шаблоны и
истинный тип скрыт.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
12.08.2013, 13:06     Указатель, как массив #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
Судя по тому о чем сейчас речь в сравнении с темой от [TC], уже и неважно кто и что понял. Но невооруженным глазом видно, что в объявлении это массив. Можно с заданным явно размером объявить (тогда пример будет надуманнее, но объявление в аргументе будет полностью закончено)) и всё равно вести себя будет как указатель. Ну, то есть как определить чем он является "на самом деле", - на ощупь?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 13:16     Указатель, как массив #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно с заданным явно размером объявить
Который ни на что не повлияет.
Цитата Сообщение от IGPIGP Посмотреть сообщение
всё равно вести себя будет как указатель
Он не будет себя вести как указатель, потому что это и есть указатель.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну то есть как определить чем он является "на самом деле", на ощупь?
Этот момент с параметрами функций просто нужно знать.
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 13:40  [ТС]     Указатель, как массив #23
Цитата Сообщение от mr_Skat Посмотреть сообщение
cout << *(arrPtr+i)
А для чего использовали смещение на і?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
12.08.2013, 13:40     Указатель, как массив #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Этот момент с параметрами функций просто нужно знать.
Согласен. Слово "притворяется" здесь вполне уместно, но это дело вкуса.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 13:46     Указатель, как массив #25
Цитата Сообщение от Erjay Посмотреть сообщение
А для чего использовали смещение на і?
Для того что бы получить i-ый объект, хранимый в участке памяти, на который указывает указатель.
Прочитайте всего две темы: Указатели и Арифметика указателей. И все станет понятно. Если конечно Вы до этого изучали хоть какие то основы C++.
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 13:57  [ТС]     Указатель, как массив #26
Убежденный, сначала не мог понять, в чем загвоздка? Но позже, вспомнил, что имя массива является указателем на первый элемент.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
12.08.2013, 14:05     Указатель, как массив #27
Цитата Сообщение от Erjay Посмотреть сообщение
что имя массива является указателем на первый элемент
Не торопитесь. Сразу не получится точно сказать. Читайте
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
А к нюансам передачи по указателю или ссылке, ещё вернётесь. Ног у них нет, - не убегут.
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 14:08  [ТС]     Указатель, как массив #28
Цитата Сообщение от Toshkarik Посмотреть сообщение
void f( int Array[]) {
++Array;
--Array;
}
int main() {
int Array[ 10 ] = {};
f( Array );
return 0;
}
И что делает эта часть кода (ниже)?
Цитата Сообщение от Toshkarik Посмотреть сообщение
++Array;
--Array;
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,492
Записей в блоге: 4
12.08.2013, 15:18     Указатель, как массив #29
Erjay, тут видно что синтаксис предоставляет "подводный камень". В объявлении параметра виден массив и он может быть объявлен даже как
C++
1
void f( int Array[3])
или
C++
1
void f( int Array[n], const int n)
или
C++
1
void f(int (&Array)[3])
по сигнатуре, просматривается передача "по значению". И это может сыграть злую шутку, даже с теми кто формально помнит, что массивы в C++ передаются только по указателю и никак иначе. Соблазн применить sizeof к имени такого массива, - пример защёлкивания ловушки.)
Даже понимая, что внутренне при передаче "имя массива" и есть копия указателя на начало, работать с этим именем как указателем - левосторонним значением, это не стиль начинающего. Хотя риска тут нет, так как такую попытку в области определения массива, просто пресечёт компилятор.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 15:24     Указатель, как массив
Еще ссылки по теме:

Как записать указатель со строковым литералом в массив - 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, 15:24     Указатель, как массив #30
Цитата Сообщение от IGPIGP Посмотреть сообщение
void f(int (&Array)[3])
Лишь добавлю, что это как раз передача массива "по ссылке" К нему уже можно применять sizeof. B в такую функцию никак не передать массив отличный от int [ 3 ].
Yandex
Объявления
12.08.2013, 15:24     Указатель, как массив
Ответ Создать тему
Опции темы

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