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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Недавно начал изучать динамическое распределение памяти и появился небольшой вопрос. Я написал программу в которой создается динамический массив объектов. Собственно вопрос в том, почему в цикле 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, 18:26   #2
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,406
Репутация: 2502

icq: 438888048
По умолчанию

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

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

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

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

Код:
#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, 22:43   #6
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,406
Репутация: 2502

icq: 438888048
По умолчанию

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

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

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

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

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

и

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

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

Цитата:
А разве 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


17:29.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.