2011-12-31 4 views
3

Newb вопрос здесь: Как я могу сохранить значение в Maptest [2] вместе с переменной? Я думал, что вы могли бы сделать это с помощью указателей, но это не работает:Обновление значений карты в C++

map<int, int*> MapTest; //create a map 

    int x = 7; 

    //this part gives an error: 
    //"Indirection requires pointer operand ("int" invalid)" 
    MapTest[2] = *x; 


    cout << MapTest[2]<<endl; //should print out 7... 

    x = 10; 

    cout <<MapTest[2]<<endl; //should print out 10... 

Что я делаю неправильно?

+3

Sidenote: Параметр '&' принимает адрес, то '*' является оператор разыменования и derefs указатель. – birryree

+1

Поскольку вам нужен указатель на x, вы должны сделать что-то вроде этого: 'MapTest [2] = & x;' – lfxgroove

+0

код неверен в нескольких аспектах. Должен быть «MapTest [2] = & x; 'и используйте' * MapTest [2] 'для доступа к значению. Вы знакомы с указателем? –

ответ

4

Вам нужен адрес отx. Ваш текущий код пытается разыменовать целое число.

MapTest[2] = &x; 

Вам тогда необходимо разыменовать то, что возвращает MapTest[2].

cout << *MapTest[2]<<endl; 
+0

Спасибо, что решил. – Jephron

0

Попробуйте вместо этого:

MapTest[2] = &x; 

Вы хотите адрес й хранить в int*. Не разыменование x, которое было бы когда-либо в области памяти 0x7, что не будет действительным.

+0

То, что сказал Питер Александр о печати материала. –

0

Есть по крайней мере, 2 проблемы здесь:

int x = 7; 
*x; // dereferences a pointer and x is not a pointer. 
m[2] = x; // tries to assign an int value to a pointer-to-int value 
// right 
m[2] = &x; // & returns the address of a value 

Теперь у вас есть новая проблема. x имеет автоматический срок службы, он будет уничтожен в конце своей области. Вы должны выделить его из бесплатного магазина (a.k.a. куча).

int* x = new int(7); 
m[2] = x; // works assigns pointer-to-int value to a pointer-to-int value 

Теперь вы должны помнить delete каждый элемент в map перед тем он выходит из области видимости или будет утечка памяти.

Это разумнее хранить значения в map, или если вам действительно нужно хранить указатели хранить подходящий смарт-указатель (shared_ptr или unique_ptr).

Для печати:

m[2]; // returns pointer value 
*m[2]; // dereferences said pointer value and gives you the value that is being pointed to 
Смежные вопросы