Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
1

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

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

Author24 — интернет-сервис помощи студентам
Объясните, пожалуйста, каким образом в 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2013, 13:15
Ответы с готовыми решениями:

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

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

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

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){};...

32
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
10.08.2013, 13:22 2
Цитата Сообщение от Erjay Посмотреть сообщение
pType
возможно это указатель на массив, виделенный в динамической п.
1
погромист
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
10.08.2013, 13:31 3
Цитата Сообщение от Erjay Посмотреть сообщение
pType[offSet]
читай *(pType + offset)
1
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
10.08.2013, 13:33  [ТС] 4
Цитата Сообщение от coloc Посмотреть сообщение
читай *(pType + offset)
И как это понять?
0
погромист
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
10.08.2013, 13:36 5
pType -- указатель. Offset -- смещение на n-количество байт. * -- возвращает элемент в памяти, адрес которого pType + offset
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
10.08.2013, 15:27 6
Цитата Сообщение от Erjay Посмотреть сообщение
И как это понять?
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
2
7 / 7 / 3
Регистрация: 11.08.2013
Сообщений: 33
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].
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 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
3
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
11.08.2013, 14:40 9
Цитата Сообщение от Erjay Посмотреть сообщение
Объясните, пожалуйста, каким образом в 10-ой строке указатель pType ведет себя как массив?
Массив это встроенный в язык обобщённый тип. Указатель тоже. Они могут быть любого типа (совместимость не полная, так как не может быть, например, массивов void, а указатели на void, - могут)) и оба поддерживают индексное обращение. Имя массива преобразуется к указателю на первый элемент в выражениях, где ожидается указатель. В 10 строке указатель на начало массива индексируется также, как это происходило бы с именем массива. В этом смысле можно говорить о похожем "поведении". А вообще, согласен с :
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
читай, что такое указатели. И не трогай пока классы и динамическое выделение памяти.
2
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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;
}
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
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;
}
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.08.2013, 01:14 12
IGPIGP, мы говорим о разных вещах. Имя массива ни в коем случае не является указателем. Оно лишь может быть не явно преобразовано в указатель. Я же говорю о параметрах функции.
void f( T [] ) == void f( T * )
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
12.08.2013, 01:54 13
Цитата Сообщение от Toshkarik Посмотреть сообщение
мы говорим о разных вещах.
А-а, понял. Вы имели в виду, что в объявленном как массив параметре фактически указатель.
Что же, может для [TC] с вопросом о "поведении" будет интересно увидеть разные примеры. И то, что имя массива преобразуется к значению указателя на первый элемент, когда это правостороннее значение, тоже пригодится.

Добавлено через 12 минут
Пример Убежденный похоже о том, что частенько спрашивают. То есть, фактически: Почему размер массива делённый на размер типа не равен размерности массива? При этом делят размер указателя.
И он же и имел в виду, что фактически sizeof будет применён к указателю. С соответствующим результатом.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель. Возможно я чего то недопонял.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.08.2013, 12:11 18
Jupiter, никогда. Это просто для читаемости.
0
Jupiter
12.08.2013, 12:12
  #19

Не по теме:

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

0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
12.08.2013, 12:59 20
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как мне кажется, он как раз говорил о том, что ( int Array[]) в параметре функции это массив, и что он ведет себя как указатель. Я лишь сказал, что это и есть указатель.
Все верно подмечено. Я говорил о том, что плохо, когда массив притворяется указателем, хотя в
приведенном примере он и является указателем, просто в параметрах функции выглядит как массив.
Это может сбить с толку и привести к ошибкам. Например, когда используются шаблоны и
истинный тип скрыт.
1
12.08.2013, 12:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2013, 12:59
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru