Форум программистов, компьютерный форум 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++ Как получить ссылку на указатель или указатель на указатель в массиве?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
12.08.2013, 13:06     Указатель, как массив #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
Судя по тому о чем сейчас речь в сравнении с темой от [TC], уже и неважно кто и что понял. Но невооруженным глазом видно, что в объявлении это массив. Можно с заданным явно размером объявить (тогда пример будет надуманнее, но объявление в аргументе будет полностью закончено)) и всё равно вести себя будет как указатель. Ну, то есть как определить чем он является "на самом деле", - на ощупь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
12.08.2013, 13:40     Указатель, как массив #24
Цитата Сообщение от Toshkarik Посмотреть сообщение
Этот момент с параметрами функций просто нужно знать.
Согласен. Слово "притворяется" здесь вполне уместно, но это дело вкуса.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
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
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
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 к имени такого массива, - пример защёлкивания ловушки.)
Даже понимая, что внутренне при передаче "имя массива" и есть копия указателя на начало, работать с этим именем как указателем - левосторонним значением, это не стиль начинающего. Хотя риска тут нет, так как такую попытку в области определения массива, просто пресечёт компилятор.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
12.08.2013, 15:24     Указатель, как массив #30
Цитата Сообщение от IGPIGP Посмотреть сообщение
void f(int (&Array)[3])
Лишь добавлю, что это как раз передача массива "по ссылке" К нему уже можно применять sizeof. B в такую функцию никак не передать массив отличный от int [ 3 ].
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
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, не читайте это на ночь.
vodilawofer
29 / 27 / 2
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 17:41     Указатель, как массив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,715
Записей в блоге: 3
12.08.2013, 17:41     Указатель, как массив #33
Цитата Сообщение от vodilawofer Посмотреть сообщение
Вывод будет такой?
Почти, но с табуляцией в ещё одной строке для вывода из ff.
Yandex
Объявления
12.08.2013, 17:41     Указатель, как массив
Ответ Создать тему
Опции темы

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