2016-05-21 4 views
0

Я прочитал, что это означает указатель на указатель. Но в приведенном ниже коде мне удалось изменить значение адреса.Изменение значения адреса с помощью **

int main() { 

    int x = 23;   // initializing variable X = 23 
    int *myVar = &x;  // Creating a pointer to the address of X 
    *myVar = 566;   // My attempt at changing the value of X address 
    cout << x << endl; // Printing out X with new value 

} 

И это работает. Как это возможно? Обозначает ли ** значение адреса?

+5

Вы никогда не использовали '**' в этом фрагменте. –

+0

Как вы думаете, какая разница между адресом и указателем? –

+0

Вы никогда не меняли значение адреса 'x'. –

ответ

4

Здесь * средние 2 разные вещи:

  • int *myVar = &x;* означает, что myVar является указателем
  • *myVar = 566; Здесь * означает, что доступ к значению, что указатель указывает на

В основном,

int x = 23;   // 'x' is 23 
int *myVar = &x;  // 'myVar' points to 'x' 
*myVar = 566;   // Assign 566 to the value that 'myVar' is pointing at (which is 'x') 
cout << x << endl; // Print 'x' 

Вы правы, что ** будет означать указатель на указатель (или доступ к значению указателя указателя):

int a = 0; //'a' is 0 
int* pa = &a; //'pa' is pointing to 'a' 
int** ppa = &pa; //'ppa' is pointing to 'pa' 

*pa = 1; //'a' is 1 
**ppa = 2' //'a' is 2 
+2

Я бы хотел добавить, * в основном является оператором разыменования. Если вы используете его вне объявления указателя, то простой способ думать, что * получает объект, на который указывает указатель. (Итак, ** «разыгрывания» указателя на два уровня, чтобы получить объект.) – Meraj99

+0

@ Meraj99 О, я понял, это как его реверсирование? – syafihakim

+0

@syafihakim Yeah :) – Rakete1111

0

Как отметил Теодорос Chatzigiannakis в комментариях, ваш вопрос mistitled , поскольку в показанном коде не используется **.

В противном случае ваше утверждение о том, что код изменяет значение адреса, ошибочно. Причина в том, что * имеет разные значения в декларациях и операторах (или выражениях).

Декларация (включая инициализацию)

int *myVar = &x; 

объявляет myVar как указатель на int, и инициализирует его иметь значение &x (адрес x).

Заявление

*myVar = 566; 

затем изменяет int по адресу, сохраненному в myVar, чтобы иметь значение 566. Так как myVar был ранее инициализирован &x, эффект меняется x, чтобы иметь значение 566. * в этом случае называется разыменованием myVar - он обращается к адресу int, который хранится в myVar (в этом случае, поскольку *myVar находится слева от оператора присваивания, для присвоения значения этому int).

+0

Так что это то же самое, что изменить значение, используя классический 'X = 566', правильно? Итак, что мне делать, если я хочу изменить значение адреса? Например, целое число 23 занимает адрес 0x213e4. Затем я хотел бы полностью стереть 23 из 0x213e4 и изменить его на 566. Как ??? – syafihakim

+0

Почему вы хотите изменить что-то, что соответствует определенному адресу, например '0x213E4'? [Да, я знаю, как это сделать - я не уверен, что вам стоит сказать вам, потому что есть несколько веских причин и множество плохих причин для покупок таких вещей, и общий результат - это неопределенное поведение в любом случае]. – Peter

+0

Да, я даже не знаю, почему я буду так поступать. Но поскольку вы сказали мне, почему я не должен этого делать, тогда я бы не стал об этом беспокоиться. – syafihakim

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