Присвоение значения 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.
Другие вопросы по тегам