Чем отличаются эти операторы Pointer *p = &i, h = &j?
Я пытался работать с указателями, и я столкнулся с этой проблемой. В этом коде... p, h два указателя... я приравнял *p = &i, h = &j; и напечатал значения, которые я ожидал, что * p будет содержать адрес, а p будет иметь адрес, указывающий на i, а в случае h h будет иметь адрес, а * h будет o/p иметь значение j.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i =10;
int *p = &i;
int j =30;
int *h;
h = &j;
printf("Hello world!\n %d , %d \n" , *p , p);
printf("Hello world!\n %d , %d \n" , *h , h);
return 20;
}
Но мои o/p в случае p и i меняются местами.. Почему это так.. Как компилятор различает ч / б эти два вида операторов.... *p = &i; и *p = i;
о / п так
Hello World!
10 , 2359060
Hello World!
30, 2359056
Извините, если заголовок Вопроса был неправильным. Я не знал, как описать ситуацию. Любые ссылки на подобные проблемы будут оценены
5 ответов
Заявление
int *p = &i;
объявляет p
как указатель на int, и инициализирует его адресом i. Это как писать
int *p;
p = &i;
После этих заявлений p
содержит адрес i
, а также *p
значение i
, Как отметил Джон Кугельман, используйте %p
спецификатор формата для печати указателей.
Это утверждение
int *p = &i;
Значит это:
int *p;
p = &i;
p
определяется как целочисленный указатель (int *
), то ему присваивается значение &i
(адрес целочисленной переменной i
).
Это не то же самое, что *p = &i
Чтобы быть менее запутанным, вы можете использовать:
int* p = &i;
Тогда вы всегда можете иметь в виду, что p относится к адресу, а *p относится к значению
Я очень согласен со вторым определением, потому что это правильный способ определения указателя. Видите ли, вы должны определить заголовок, а затем назначить ему переменную, на которую нужно указать, без *
,
Если i
является переменным холдингом 10
и вы определяете p
как int *
держа адрес i
тогда ваши высказывания означают:
printf("Hello world!\n %d , %d \n" ,
*p , // value inside p, ie value of i, 10
p); // value OF p, which is the address of i