Здравствуйте что означает этот знак " * "в 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") ?
C/C++
В свою очередь, на каждой итерации цикла iter содержит разные адреса: от inventory.begin() на первой итерации до inventory.end() - 1 на последней.
Это: *(inventory.begin()) = "battle axe";
Унарный * - это операция разыменования: получение значения по адресу RAM (указателю), содержащемуся в операнде.
P.S. Прежде, чем пытаться разобраться с итераторами, разберись с указателями.
Понятие " * " в c++
cout << *iter << endl;Нет. Это означает, что мы берём значение по адресу, находящемуся в переменной iter.
это означает что мы берем значение inventory.begin()?
В свою очередь, на каждой итерации цикла iter содержит разные адреса: от inventory.begin() на первой итерации до inventory.end() - 1 на последней.
myIterator = inventory.begin();Нет, это абсолютно другое.
*myIterator = "battle axe";
это тоже самое что и myIterator = (inventory.begin() = "battle axe") ?
Это: *(inventory.begin()) = "battle axe";
Унарный * - это операция разыменования: получение значения по адресу RAM (указателю), содержащемуся в операнде.
P.S. Прежде, чем пытаться разобраться с итераторами, разберись с указателями.
Станислав Кремковский
Все же итератор это не совсем указатель и на область памяти он не совсем указывает, хотя и может вернуть значение итерируемого объекта.
Это оператор, есть бинарный (аналог обычного умножения). есть унарный (аналог разыменования указателя).
Итераторы - это определенные в 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;
Итераторы - это определенные в 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".
В общем, в данном контексте " * " используется для доступа к элементам контейнера (вектора), на которые указывают итераторы.
Давайте разберемся с вашими примерами:
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".
В общем, в данном контексте " * " используется для доступа к элементам контейнера (вектора), на которые указывают итераторы.
Похожие вопросы
- Помогите написать программу по теме "Строки" на языке C.
- C++ Какие вы знаете интересные команды system (" ") ?
- C++: "С-Строка" и ошибка
- Как "подружить" MS-DOS и C++?
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование C++ ПРОШУ ПОМОЧЬ!
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Задача на C++ (Остатки).