2014-01-29 3 views
1

Я учусь о указателях на C++, и я прочитал статью об этом, и я думаю, что я это понимаю, хотя я просто хотел получить разъяснения по псевдокоду, который я написал.Я правильно понимаю указатели? C++

int someGameHealthAddress = 1693; 
int healthIWantItToBe = 20; 
int * newHealthValue; 

newHealthValue = someGameHealthAddress; 
*newHealthValue = healthIWantItToBe; 

Значит, это правильно? Как это работает?

РЕДАКТИРОВАТЬ: Спасибо всем, что ответили, рад, что я получил это сейчас. Вы были большой помощью :) EDIT2: Я очень горжусь, что у меня есть это. По внешнему виду у многих людей есть проблемы с пониманием указателей.

+3

выше не является правильным. Было бы проще помочь, если бы вы описали, что вы на самом деле хотите делать с указателями. – juanchopanza

ответ

1

Практически. Для того, чтобы получить указатель на переменную, вам нужно «адрес» оператор &:

// Set newHealthValue to point to someGameHealth 
newHealthValue = &someGameHealth; 

(я удалил «Адрес» от имени переменной, так как он не является адресом Указатель теперь содержит. его адрес).

Тогда ваша последняя строка кода изменит значение объекта, на которое указывает newHealthValue, то есть оно изменится на someGameHealth.

1

Это утверждение неверно:

newHealthValue = someGameHealthAddress; 

Так как левая сторона имеет тип указателя и правая сторона представляет собой целое число. Вы должны убедиться, что типы совпадают в заданиях. Для того, чтобы получить адрес someGameHealthAddress используйте &:

newHealthValue = &someGameHealthAddress; 

Теперь типы совпадают, потому что правая сторона представляет собой адрес целого, и, таким образом, указатель.

2

Если someGameHealthAddress должен быть адресом, то вам необходимо объявить его как таковой. Например:

int someGameHealth = 1693; 
int healthIWantItToBe = 20; 
int * someGameHealthAddress; //this is the pointer to an int, which is basically its address 

someGameHealthAddress = &someGameHealth; // take address of someGameHealth 
*someGameHealthAddress = healthIWantItToBe; // modify the value it points to 

В коде эта линия не так:

newHealthValue = someGameHealthAddress;

Поскольку missmatches типы переменных, это как int* = int.

Обратите внимание, что это может быть отбрасывание и целочисленный тип в тип указателя, это почти всегда ошибка, потому что вы почти никогда не знаете абсолютное значение адреса переменной в памяти. Вы обычно находите что-то, а затем работаете с относительными смещениями. Обычно это происходит, когда вы делаете какой-то взлом в памяти, который кажется вашим примером.

1

В зависимости, если вы хотите, чтобы значение указателя будет 1693, или вы хотите, чтобы указатель, чтобы указать на адрес переменной someGameHealthAddress

1.присваивает значение newHealthValue значению someGameHealthAddress

*newHealthValue = someGameHealthAddress; 
  1. присваивает newHealthValue, чтобы указать на адрес someGameHealthAddress переменной

    * newHealthValue = & someGameHealthAddress;

  2. присваивает адрес newHealthValue к значению переменной someGameHealthAddress

    & newHealthValue = someGameHealthAddress;

  3. присваивает адрес newHealthValue в адрес someGameHealthAddress переменной

    & newHealthValue = & someGameHealthAddress;

+0

А, это на самом деле то, что я пытался сделать, я понял это после прочтения некоторых из приведенных ниже ответов, но спасибо. Это было то, что я хотел сделать в своем исходном коде: D – user2932566

0

* и & два оператора, используемые в c++

& means "the address off" 

т.е. & р означает адрес р.

* means "value in the location" 

* р означает значение адреса, сохраненного в р.

Для этого p должен мне указатель (потому что p должен содержать адрес).

Здесь newHealthValue = someGameHealthAddress; предоставит ошибку компиляции.because someGameHealthAddress является целым числом, а newHealthValue является целым указателем. int*=int имеет тип MISS матча

Вы можете сохранить адрес someGameHealthAddress с помощью следующего оператора

newHealthValue = &someGameHealthAddress;

which means newHealthValue = (address of)someGameHealthAddress 

*newHealthValue = healthIWantItToBe; синтаксически корректен, поскольку он сохраняет значение healthIWantItToBe по адресу, на который указывает newHealthValue

Смежные вопросы