Присвоение значения int адресу
Я думал, что следующие коды были правильными, но это не работает.
int x, *ra;
&ra = x;
а также
int x, ra;
&ra = x;
Пожалуйста, помогите мне, если оба этих фрагмента кода верны. Если нет, какие ошибки вы видите в них?
6 ответов
Ваши оба выражения неверны, должно быть:
int x, *ra;
ra = &x; // pointer variable assigning address of x
&
is ampersand - адрес оператора (в унарном синтаксисе), используя &
Вы можете назначить адрес переменной x
в переменную указателя ra
,
Более того, как следует из названия вопроса: Assigning int value to an address
,
ra
указатель содержит адрес переменной x
так что вы можете назначить новое значение x
с помощью ra
*ra = 20;
Вот *
перед указателем переменной (в унарном синтаксисе) оператор опережения дает значение по адресу.
Потому что вы также пометили вопрос на C++, поэтому я думаю, что вы запутались с объявлением ссылочной переменной, то есть:
int x = 10;
int &ra = x; // reference at time of declaration
Соответственно, в случае ссылочной переменной, если вы хотите присвоить новое значение x
это очень просто в синтаксисе, как мы делаем со значением переменной:
ra = 20;
(обратите внимание, даже ra
ссылочная переменная, которую мы назначаем x
без &
или же *
все еще изменение отражает, это преимущество ссылочной переменной: простой в использовании, способный в качестве указателей!)
Запомните привязку ссылки, данную во время объявления, и она не может измениться, когда указатель переменной может указывать на новую переменную позже в программе.
В C у нас есть только переменные-указатели и значения, тогда как в C++ у нас есть переменные-указатели, ссылки и значения. В своем связанном ответе я попытался объяснить различия между указателем и ссылочной переменной.
Оба неверны.
Когда вы объявляете указатель, вы назначаете ему адрес переменной. Вы пытаетесь наоборот. Правильный путь будет:
int x,*ra;
ra = &x;
Обе эти причины, в том виде, в каком они есть в вашем вопросе, - неопределенное поведение.
Во-первых, вы не инициализируете указатель, то есть он указывает на случайное местоположение (или NULL
если переменная является глобальной).
Во-вторых, вы пытаетесь изменить адрес, по которому находится переменная, который (если он даже скомпилируется) не разрешен.
Вот некоторый аннотированный код:
int main () {
// declare an int variable
int x = 0;
// declare a pointer to an int variable
int *p;
// get the memory address of `x`
// using the address-of operator
&x;
// let `p` point to `x` by assigning the address of `x` to `p`
p = &x;
// assign `x` a value directly
x = 42;
// assign `x` a value indirectly via `p`
// using the dereference operator
*p = 0;
// get the value of `x` directly
x;
// get the value of `x` indirectly via `p`
// using the dereference operator
*p;
}
Обратите внимание, что разыменование указателя, который не указывает на допустимый объект указанного типа, не допускается.
Поэтому обычно вы не должны делать что-то вроде следующего (если вы действительно не знаете, что делаете):
*(int*)(12345) = 42; // assign an integer value to an arbitrary memory address
Вот мои 2 цента.
Если вы собираетесь понять указатель в C. Сначала сделайте различие между *
оператор и *
спецификатор типа / спецификатор.
Смотрите, что в C *
является синтаксическим элементом, который может играть обе роли, но никогда одновременно. Спецификатор типа:
int a;
int * c = &a;
int * my_function_returning_pointer();
И для получения правильного инт. Как оператор. (*c
псевдоним a
)
*c = 9;
Я признаю, что это довольно запутанно и может заманить в ловушку новичка. Убедитесь, что вы знаете, когда *
используется как оператор или когда он используется как спецификатор типа.
То же самое относится и к &
хотя он реже используется как классификатор типов.
int & f = returning_a_reference();
int my_function( int & refParam);
Чаще всего используют для получения адреса объекта. Таким образом, он используется в качестве оператора.
c = &f;
case 1:
int x,*ra;
&ra = x;
it is wrong in c, because in c we can point to a memory location by using a pointer ( i.e *ra in your case ). this can be done as fallows
int x, *ra; x ---------
ra=&x; ra --->1000 | value |
----------
NOTE : with out initializing a variable we can't use pointer to hold the address of that variable, so you better to first initialize variable, then set pointer to that memory location.
int x, *ra;
x=7;
ra=&x;
Fallowing may be helpful to you:
problems(mistake we do ) in handling pointers :
1.)
int a ,*p;
p=a; // assigning value instead of address. that leads to segmentation fault at run time.
2)
int a, *p;
&p=a; // look at here wrong assignment
3)
char *p="srinivas"
strcat(p, "helo" ) ; // we cant add a substring to the constant string.
4) int a=5, *p;
p=5; // the pointer here will points to location 5 in the memory, that may damage whole system, be care full in these type of assignments.