Как работает эта операция над указателями? - PullRequest
1 голос
/ 30 декабря 2011
  int x = 4;
  int* q = &x;                 // Is it always equivalent to int *q = &x;  ?
  cout << "q = " << q << endl; // output: q = 0xbfdded70
  int i = *q;                  // A
  int j = *(int*)q;            // B, when is this necessary?
  cout << "i = " << i << endl; // output: i = 4
  cout << "j = " << j << endl; // output: j = 4

Мой вопрос в том, что делают строки A и B, и почему оба выхода равны 4?

Ответы [ 7 ]

3 голосов
/ 30 декабря 2011

Это базовое использование указателей, в A вы разыменовываете указатель (обращаетесь к переменной, на которую указывает указатель) ":

int i = *q; // A

в то время как B делает то же самое, но он дополнительно приводит указатель к тому же типу. Вы могли бы написать это так:

int j = *q; // B

нет необходимости (int *)

2 голосов
/ 30 декабря 2011
  int x = 4;

х равен 4

  int* q = &x;

q равно ячейка памяти из x (которая содержит 4)

  cout << "q = " << q << endl; // output: q = 0xbfdded70

Там находится ваша память.

  int i = *q; // A

i - значение в ячейке памяти q

  int j = *(int*)q; // B

j - значение в ячейке памяти q. q приводится к указателю на int, но это уже то, что есть.

1 голос
/ 30 декабря 2011

A: Разыменование - получает указатель на значение (переменную или объект) и возвращает значение

B: приведение к int* и затем разыменование

Результат тот же, потому что указатель уже на int.Вот и все.

1 голос
/ 30 декабря 2011

Строки A и B эквивалентны, поскольку q уже является int *, и поэтому (int *) q равно q. int i = * q; приводит к тому, что я становится значением целого числа, на которое указывает q. Если вы хотите, чтобы я был равен самому адресу, уберите звездочку.

1 голос
/ 30 декабря 2011
int i = *q; // A

Разыменовывает указатель для получения указанного значения

int j = *(int*)q; // B

type приводит указатель к int * и затем разыменовывает его.

Оба одинаковы, потому что указатель уже указывает на int. Таким образом, приведение к int * во втором случае вообще не требуется.

Дальнейшее разыменование дает целочисленное значение целочисленной переменной в обоих случаях.

0 голосов
/ 30 декабря 2011

Строка Указатель отмены ссылки q, напечатанный как int *, то есть указатель указывает на значение int.

Строка B приведена q как (int *) перед снятием ссылки, поэтому строка B такая же, как int j = *q;.

0 голосов
/ 30 декабря 2011

Строка A принимает значение, на которое указывает q, и присваивает его i.Строка b приводит q к типу int* (который уже является типом q, так что приведение является полностью избыточным / бессмысленным), затем принимает значение, на которое указывает q, и присваивает его j.

Оба дают вам 4, потому что это значение, на которое указывает q.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...