C/C++

Понятие " * " в c++

Здравствуйте что означает этот знак " * "в c++?
я писал программу из книги, в ней не очень понятно написано что это за знак.


вот отрывок из книги:

vector<string> inventory;
inventory.push_back("sword");
inventory.push_back("armor");
inventory.push_back("shield");
vector<string>::iterator myIterator;
vector<string>::const_iterator iter;
cout << "Your items: \n";

for (iter = inventory.begin(); iter != inventory.end(); ++iter)
{
cout << *iter << endl;
}

cout << "\nYou trade your sword for a battle axe.";
myIterator = inventory.begin();
*myIterator = "battle axe";


меня интересуют эти строчки:


cout << *iter << endl;
это означает что мы берем значение inventory.begin()?

myIterator = inventory.begin();
*myIterator = "battle axe";
это тоже самое что и myIterator = (inventory.begin() = "battle axe") ?
Кар Ат
Кар Ат
167
cout << *iter << endl;
это означает что мы берем значение inventory.begin()?
Нет. Это означает, что мы берём значение по адресу, находящемуся в переменной iter.
В свою очередь, на каждой итерации цикла iter содержит разные адреса: от inventory.begin() на первой итерации до inventory.end() - 1 на последней.
myIterator = inventory.begin();
*myIterator = "battle axe";
это тоже самое что и myIterator = (inventory.begin() = "battle axe") ?
Нет, это абсолютно другое.
Это: *(inventory.begin()) = "battle axe";

Унарный * - это операция разыменования: получение значения по адресу RAM (указателю), содержащемуся в операнде.

P.S. Прежде, чем пытаться разобраться с итераторами, разберись с указателями.
КМ
Камил Махмадиев
51 952
Лучший ответ
Станислав Кремковский Все же итератор это не совсем указатель и на область памяти он не совсем указывает, хотя и может вернуть значение итерируемого объекта.
Это оператор, есть бинарный (аналог обычного умножения). есть унарный (аналог разыменования указателя).
Итераторы - это определенные в STL типы, унарный оператор * в них переопределен, здесь он и использован.
Семантически, итераторы несколько похожи на указатели, в данном случае * используется для вытаскивания значения из того места, на которое "смотрит" итератор. Вообще говоря, оттуда можно не только читать, но и в некоторых случаях туда писать.

Простой аналог на Си:

int array[] = {1, 4, 2}; // аналог std::vetcor<int> inventory = { 1, 4, 2 }
int* ptr = myarr; // аналог vector<int>::iterator myIterator = inventory.begin();
++ptr; // аналог ++myIterator;
*myptr = 2; // аналог *myIterator = 2;
В языке программирования C++, символ " * " имеет несколько значений в зависимости от контекста. В вашем случае, он используется как оператор разыменовывания, что означает получение значения по указанному адресу (или итератору).

Давайте разберемся с вашими примерами:

1. `cout << *iter << endl;`
Здесь `*iter` означает "получить значение, на которое указывает итератор `iter`". То есть, вы берете каждый элемент вектора `inventory` по очереди.

2. `myIterator = inventory.begin(); *myIterator = "battle axe";`
Первая строчка присваивает `myIterator` итератор, указывающий на начало вектора `inventory`. Вторая строка изменяет значение элемента, на который указывает `myIterator`, на "battle axe". То есть, это не то же самое, что `myIterator = (inventory.begin() = "battle axe")`. Оно заменяет первый элемент вектора `inventory` на "battle axe".

В общем, в данном контексте " * " используется для доступа к элементам контейнера (вектора), на которые указывают итераторы.
CE
Cfyz Edfer
14 368