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

Купить рекламу на форуме 15-35 тыс рублей в месяц

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

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

           Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
           И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2013, 18: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, 18:26   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,772
По умолчанию

ptr - указатель
ptr[i] - объект
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 19.05.2013, 18: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, 18:31   #4
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Ясно, спасибо
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 22: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, 22:43   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,772
По умолчанию

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

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

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

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

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

и

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

Ну да, тут я вижу разницу.
Dima-War вне форума Ответить с цитированием
Старый 19.05.2013, 22: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 вне форума Ответить с цитированием
Ответ

           Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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