Значение указателя * x & x и x - PullRequest
3 голосов
/ 27 января 2012

предположим, этот код:

main()
{
    int *x;
    *x = 3;

    printf("%d %d %d\n", *x, &x, x);
    // output 3 5448392 2293524
}

, если *x - это значение; &x адреса; что означает это значение x?

Ответы [ 8 ]

9 голосов
/ 27 января 2012
  • *x - это значение (правильное)
  • x - адрес значения. РЕДАКТИРОВАТЬ В вашем случае этот адрес не инициализирован, поэтому он нигде не указывает (спасибо Киту Николасу за упоминание этого).
  • &x - это адрес [указателя, который должен содержать] адрес значения.

(стоит отметить, что ваша программа может аварийно завершить работу:)

5 голосов
/ 27 января 2012
Adr     value    expression
----------------------------------------------
5448392 2293524  &x address of x
2293524 3         x place where you assigned 3
3 голосов
/ 27 января 2012

x дает вам адрес в памяти, где находится значение *x, т.е. 3. &x дает адрес, где находится значение x, т.е. 2293524.

2 голосов
/ 27 января 2012

x - указатель на int, это не сам int, это не адрес int, это указатель.

указатель содержит адрес типа int.

Итак, пропущенный шаг у вас (ваша программа ни на что не указывает x! Очень опасно)

int y = 5;
int *x;

x = &y     // put the memory location of y into the pointer

если вы теперь печатаете содержимое указателя ...

printf("%d\n", x);    // prints out the memory location of y; 

теперь, чтобы получить значение того, на что указывает ваш указатель (на данный момент, y)

printf("%p\n", *x);    // prints out 5; 

теперь, так же как у у есть место в памяти, у х также есть место в памяти

поэтому & x находится там, где указатель 'x' находится в памяти

2 голосов
/ 27 января 2012

Это адрес, который содержит x.Будучи объявленным в качестве указателя, x хранит адрес, а & x в некотором смысле является указателем на указатель.

РЕДАКТИРОВАТЬ: Так что я был не так точен, как следовало бы.& x, строго говоря, не указатель на указатель.Это адрес указателя.В следующей строке кода y является указателем на указатель:

int **y = &x;
1 голос
/ 27 января 2012
Значения

x и &x относятся к типам указателей, поэтому для вывода их значений следует использовать спецификатор преобразования p.

printf("%d %p %p\n", *x, (void *) &x, (void *) x);

Не забудьте привести к void *, иначе вызов printf будет неопределенным поведением. (p спецификатору преобразования требуется аргумент типа void *).

int *x;
int y = 0;      
x = &y; 
*x = 3;

x - указатель на int. *x - это int, а его значение равно 3. И &x - это указатель на указатель на int. Обратите внимание, что ваш указатель должен указывать на действительный объект объекта (как выше), в противном случае он имеет недопустимое значение.

1 голос
/ 27 января 2012

&x - адрес объекта указатель .Значение указателя является адресом int.

. Кроме того, вам не следует присваивать * x, как в вашем примере: x нигде не указывает допустимо.

1 голос
/ 27 января 2012

x неинициализирован, поэтому он указывает на никуда, и разыменование его с помощью * является неопределенным поведением.

Следующее было бы более правильной (и полезной) программой

main()
{
    int x;   //declare an int variable
    int *xp; //declare a pointer to an int variable
    xp = &x;
    *xp = 3;

    printf("%d %d %d %d %d\n", x, &x, xp, *xp, &xp);
}

x - это значение, xp и & xp указывают на это значение, * xp может использоваться для доступа и изменения значения, а & xp - указатель на этот указатель ...

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