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

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

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

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

10.08.2013, 13:15. Просмотров 1202. Ответов 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;
};
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2013, 13:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель, как массив (C++):

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив. - C++
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Условие:Реализовать 3 функции, каждая из которых принимает указатель на...

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

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

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

Как сделать указатель на массив - C++
Здрасти. Как мне сделать указатель на массив: string stud= {{&quot;49000&quot;, &quot;Eddy&quot;, &quot;Vedder&quot;, &quot;dzienne&quot;, &quot;19&quot;}, {&quot;49001&quot;, &quot;Roger&quot;,...

Как объявить указатель на массив через typedef и как инициализировать такой тип - C++
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 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()
1
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 >
коде?

0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 12:11 #18
Jupiter, никогда. Это просто для читаемости.
0
Jupiter
12.08.2013, 12:12
  #19

Не по теме:

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

0
Убежденный
Системный программист
Эксперт С++
15547 / 7055 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
12.08.2013, 12:59 #20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как мне кажется, он как раз говорил о том, что ( int Array[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель.
Все верно подмечено. Я говорил о том, что плохо, когда массив притворяется указателем, хотя в
приведенном примере он и является указателем, просто в параметрах функции выглядит как массив.
Это может сбить с толку и привести к ошибкам. Например, когда используются шаблоны и
истинный тип скрыт.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
12.08.2013, 13:06 #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
Судя по тому о чем сейчас речь в сравнении с темой от [TC], уже и неважно кто и что понял. Но невооруженным глазом видно, что в объявлении это массив. Можно с заданным явно размером объявить (тогда пример будет надуманнее, но объявление в аргументе будет полностью закончено)) и всё равно вести себя будет как указатель. Ну, то есть как определить чем он является "на самом деле", - на ощупь?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 13:16 #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно с заданным явно размером объявить
Который ни на что не повлияет.
Цитата Сообщение от IGPIGP Посмотреть сообщение
всё равно вести себя будет как указатель
Он не будет себя вести как указатель, потому что это и есть указатель.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну то есть как определить чем он является "на самом деле", на ощупь?
Этот момент с параметрами функций просто нужно знать.
0
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 13:40  [ТС] #23
Цитата Сообщение от mr_Skat Посмотреть сообщение
cout << *(arrPtr+i)
А для чего использовали смещение на і?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
12.08.2013, 13:40 #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Этот момент с параметрами функций просто нужно знать.
Согласен. Слово "притворяется" здесь вполне уместно, но это дело вкуса.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 13:46 #25
Цитата Сообщение от Erjay Посмотреть сообщение
А для чего использовали смещение на і?
Для того что бы получить i-ый объект, хранимый в участке памяти, на который указывает указатель.
Прочитайте всего две темы: Указатели и Арифметика указателей. И все станет понятно. Если конечно Вы до этого изучали хоть какие то основы C++.
1
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 13:57  [ТС] #26
Убежденный, сначала не мог понять, в чем загвоздка? Но позже, вспомнил, что имя массива является указателем на первый элемент.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
12.08.2013, 14:05 #27
Цитата Сообщение от Erjay Посмотреть сообщение
что имя массива является указателем на первый элемент
Не торопитесь. Сразу не получится точно сказать. Читайте
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
А к нюансам передачи по указателю или ссылке, ещё вернётесь. Ног у них нет, - не убегут.
1
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;
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 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 к имени такого массива, - пример защёлкивания ловушки.)
Даже понимая, что внутренне при передаче "имя массива" и есть копия указателя на начало, работать с этим именем как указателем - левосторонним значением, это не стиль начинающего. Хотя риска тут нет, так как такую попытку в области определения массива, просто пресечёт компилятор.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
12.08.2013, 15:24 #30
Цитата Сообщение от IGPIGP Посмотреть сообщение
void f(int (&Array)[3])
Лишь добавлю, что это как раз передача массива "по ссылке" К нему уже можно применять sizeof. B в такую функцию никак не передать массив отличный от int [ 3 ].
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 15:24
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.08.2013, 15:24
Ответ Создать тему
Опции темы

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