Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 19.05.2013, 17:23   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Вопрос по указателю

Недавно начал изучать динамическое распределение памяти и появился небольшой вопрос. Я написал программу в которой создается динамический массив объектов. Собственно вопрос в том, почему в цикле for обращение к методам идет не через операцию ->, а через операцию точки. Ведь ptr вроде как указатель.

Код:
class Test
{
private:
	int number;
public:
	void getNumber();
	void showNumber();
};

void Test::getNumber()
{
	cin >> number;
}

void Test::showNumber()
{
	cout << number << endl;
}

int main()
{
	Test *ptr;
	int amount = 0;
	cin >> amount;
	ptr = new Test[amount];
	for(int i = 0; i < amount; i++)
	{
		ptr[i].getNumber();
	}
	for(int i = 0; i < amount; i++)
	{
		ptr[i].showNumber();
	}
	system("pause");
	return 0;
}
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 17:26   #2
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,744
По умолчанию

ptr - указатель
ptr[i] - объект
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.05.2013, 17:27   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

ptr - указатель. *(ptr+5) и ptr[5] - одно и то же.
Сравните:
Код:
const char* str = "Hello, world!"; //str - указатель на char
assert(str[4] == 'o'); //str[4] - char
Abstraction вне форума Ответить с цитированием
Старый 19.05.2013, 17:31   #4
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Ясно, спасибо
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 21:24   #5
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

И все таки я ничего не понял... Почему в примере выше доступ к методом получаем через операцию точки, а тут уже через стрелку?

Код:
#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;

class Person
{
private:
	string name;
public:
	void setName();
	void printName() { cout << name << endl; }
};

void Person::setName()
{
	cout << "Введите имя: ";
	cin >> name;
}

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	Person *ptr[5];
	for(int i = 0; i < 5; i++)
	{
		ptr[i] = new Person;
		ptr[i]->setName();
		ptr[i]->printName();
	}
	system("pause");
	return 0;
}
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 21:43   #6
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,744
По умолчанию

Person *ptr[5]; - массив из 5 указателей на Person.
ptr - указатель на массив указателей.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.05.2013, 21:48   #7
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

А разве ptr не является тем же массивом из amount указателей на класс Test?
Я вот смотрю на оба примера, чувствую истину, а до конца все равно уловить не могу..(

Последний раз редактировалось Dima-War; 19.05.2013 в 21:51.
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 21:53   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

чуешь разницу:

Test *ptr; //один указатель

и

Person *ptr[5]; //массив из 5ти указателей
_Bers вне форума Ответить с цитированием
Старый 19.05.2013, 21:58   #9
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Ну да, тут я вижу разницу.
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 21:58   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
А разве ptr не является тем же массивом из amount указателей на класс Test?
Нет. Если переменная объявлена декларатором вида
Код:
Type* variable1;
Type variable2[N];
, то она в большинстве выражений приводится к Type*. Соответственно, variable1[2], variable2[42] - имеют тип Type.

Это касается и случая, когда Type - сам указатель:
Код:
OtherType** var1;
OtherType* var2[N];
var1[17], var2[33] - имеют тип OtherType*.

Это вообще не имеет отношения к тому, что там в эти переменные занесли, в них может быть хоть NULL. Если переменная объявлена вот так, то компилятор будет обходиться с ней вот таким образом.
Abstraction вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
получить строку по указателю jivvs Общие вопросы C/C++ 3 19.01.2011 18:40
есть ли что то по указателю? the_deer_one Общие вопросы C/C++ 3 21.08.2010 22:18
Вопрос по указателю marazmaticus Общие вопросы C/C++ 6 12.03.2010 00:05
Передача массива по указателю liver1981 Общие вопросы C/C++ 3 21.04.2009 16:07
Зачем указателю тип? Scratch Общие вопросы C/C++ 5 30.09.2008 10:48


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя