Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Erjay
0 / 0 / 8
Регистрация: 03.08.2013
Сообщений: 91
#1

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

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

http://www.cyberforum.ru/cpp-beginners/thread544945.html

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2013, 13:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Указатель, как массив (C++):

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

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как...

Как сделать указатель на массив
Здрасти. Как мне сделать указатель на массив: string stud= {{&quot;49000&quot;, &quot;Eddy&quot;,...

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

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

32
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
12.08.2013, 13:06 #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
Судя по тому о чем сейчас речь в сравнении с темой от [TC], уже и неважно кто и что понял. Но невооруженным глазом видно, что в объявлении это массив. Можно с заданным явно размером объявить (тогда пример будет надуманнее, но объявление в аргументе будет полностью закончено)) и всё равно вести себя будет как указатель. Ну, то есть как определить чем он является "на самом деле", - на ощупь?
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
12.08.2013, 13:16 #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно с заданным явно размером объявить
Который ни на что не повлияет.
Цитата Сообщение от IGPIGP Посмотреть сообщение
всё равно вести себя будет как указатель
Он не будет себя вести как указатель, потому что это и есть указатель.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну то есть как определить чем он является "на самом деле", на ощупь?
Этот момент с параметрами функций просто нужно знать.
0
Erjay
0 / 0 / 8
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 13:40  [ТС] #23
Цитата Сообщение от mr_Skat Посмотреть сообщение
cout << *(arrPtr+i)
А для чего использовали смещение на і?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
12.08.2013, 13:40 #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Этот момент с параметрами функций просто нужно знать.
Согласен. Слово "притворяется" здесь вполне уместно, но это дело вкуса.
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
12.08.2013, 13:46 #25
Цитата Сообщение от Erjay Посмотреть сообщение
А для чего использовали смещение на і?
Для того что бы получить i-ый объект, хранимый в участке памяти, на который указывает указатель.
Прочитайте всего две темы: Указатели и Арифметика указателей. И все станет понятно. Если конечно Вы до этого изучали хоть какие то основы C++.
1
Erjay
0 / 0 / 8
Регистрация: 03.08.2013
Сообщений: 91
12.08.2013, 13:57  [ТС] #26
Убежденный, сначала не мог понять, в чем загвоздка? Но позже, вспомнил, что имя массива является указателем на первый элемент.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
12.08.2013, 14:05 #27
Цитата Сообщение от Erjay Посмотреть сообщение
что имя массива является указателем на первый элемент
Не торопитесь. Сразу не получится точно сказать. Читайте
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
А к нюансам передачи по указателю или ссылке, ещё вернётесь. Ног у них нет, - не убегут.
1
Erjay
0 / 0 / 8
Регистрация: 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
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
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
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
12.08.2013, 15:24 #30
Цитата Сообщение от IGPIGP Посмотреть сообщение
void f(int (&Array)[3])
Лишь добавлю, что это как раз передача массива "по ссылке" К нему уже можно применять sizeof. B в такую функцию никак не передать массив отличный от int [ 3 ].
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
12.08.2013, 15:35 #31
Цитата Сообщение от Toshkarik Посмотреть сообщение
Лишь добавлю, что это как раз передача массива "по ссылке" К нему уже можно применять sizeof. B в такую функцию никак не передать массив отличный от int [ 3 ].
Это верно. Последний пример как раз для данного случая неудачен. Скопировал из заготовок примеров не подумав
Тут как раз это и видно:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#define array_size(a) (sizeof (a) / sizeof (a[0]))
using namespace std;
void f(int Array[3]) {//то есть значение в скобках - напоминание самому себе (коментарий)?
                      //на деле нет объявления массива и передачи по значению.
 
Array[0]=4; Array[1]=5; Array[2]=6;
  cout<<*(Array++)<<" ";
  cout<<*(Array++)<<" ";
  cout<<*(Array++)<<endl;
 
  }
 
void ff(int (&Array)[3]) {//по ссылке 
Array[0]=7; Array[1]=8; Array[2]=9;
//cout<<*(Array++)<<" ";//: error C2105: для "++" требуется левостороннее значение
  cout<<*(Array)<<" ";
  cout<<*(Array+1)<<" ";
  cout<<*(Array+2)<<endl;
 
   for (size_t i = 0; i < array_size(Array); ++i)
    {
        std::cout << Array[i]<<"\t";
    }
   cout<<endl;
}
 
int main() {
int Array[3] = { 1, 2, 3 };
 
 
f( Array );
 
cout<<*(Array)<<endl;
cout<<*(Array+1)<<endl;
cout<<*(Array+2)<<endl;
ff( Array );
cout<<*(Array)<<endl;
cout<<*(Array+1)<<endl;
cout<<*(Array+2)<<endl;
 
cin.get();   
   return 0;
}
Erjay, не читайте это на ночь.
1
vodilawofer
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
12.08.2013, 16:52 #32
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это верно. Последний пример как раз для данного случая неудачен. Скопировал из заготовок примеров не подумав
Тут как раз это и видно:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#define array_size(a) (sizeof (a) / sizeof (a[0]))
using namespace std;
void f(int Array[3]) {//то есть значение в скобках - напоминание самому себе (коментарий)?
                      //на деле нет объявления массива и передачи по значению.
 
Array[0]=4; Array[1]=5; Array[2]=6;
  cout<<*(Array++)<<" ";
  cout<<*(Array++)<<" ";
  cout<<*(Array++)<<endl;
 
  }
 
void ff(int (&Array)[3]) {//по ссылке 
Array[0]=7; Array[1]=8; Array[2]=9;
//cout<<*(Array++)<<" ";//: error C2105: для "++" требуется левостороннее значение
  cout<<*(Array)<<" ";
  cout<<*(Array+1)<<" ";
  cout<<*(Array+2)<<endl;
 
   for (size_t i = 0; i < array_size(Array); ++i)
    {
        std::cout << Array[i]<<"\t";
    }
   cout<<endl;
}
 
int main() {
int Array[3] = { 1, 2, 3 };
 
 
f( Array );
 
cout<<*(Array)<<endl;
cout<<*(Array+1)<<endl;
cout<<*(Array+2)<<endl;
ff( Array );
cout<<*(Array)<<endl;
cout<<*(Array+1)<<endl;
cout<<*(Array+2)<<endl;
 
cin.get();   
   return 0;
}
Erjay, не читайте это на ночь.
Вывод будет такой?
4 5 6
4
5
6
7 8 9
7
8
9
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
12.08.2013, 17:41 #33
Цитата Сообщение от vodilawofer Посмотреть сообщение
Вывод будет такой?
Почти, но с табуляцией в ещё одной строке для вывода из ff.
1
12.08.2013, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 17:41
Привет! Вот еще темы с решениями:

Как заставить массив превратиться в указатель?
Привет! Как известно, при передаче массива в функцию он превращается в...

Как обьявить указатель на двумерный массив?
обьясните на примере как обьявить указатель на двумерный массив и потом...

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

Указатель на статический массив как параметр шаблона
Добрый день. Необходимо параметр шаблона сделать указателем и передавать в...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Опции темы

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