Подтвердить что ты не робот

Значение "ссылки" и "разыменование",

Я читал разные вещи в Интернете и путался, потому что каждый сайт говорит разные вещи.

Говоря о C.

Я читал о * ссылочном операторе и & операторе разыменования; или что ссылка означает, что указатель указывает на переменную, а разыменование - это доступ к значению переменной, на которую указывает указатель. Поэтому я смутился.

Могу ли я получить простое, но исчерпывающее объяснение "ссылки и удаление ссылок"?

4b9b3361

Ответ 1

Ссылка означает получение адреса существующей переменной (с использованием &) для установки переменной-указателя. Чтобы быть действительным, указатель должен быть установлен на адрес переменной того же типа, что и указатель, без звездочки:

int  c1;
int* p1;
c1 = 5;
p1 = &c1;
//p1 references c1

Разыменование указателя означает использование оператора * (символ звездочки) для извлечения значения из адреса памяти, на который указывает указатель: ПРИМЕЧАНИЕ. Значение, хранящееся по адресу указателя, должно быть значением ОДНОГО ТИПА в качестве типа переменная, на которую указывает "указатель", но нет гарантии, что это так, если указатель не был установлен правильно. Тип переменной, на которую указывает указатель, - это тип, который меньше внешней звездочки.

int n1;
n1 = *p1;

Неправильная разыменование может вызвать или не вызвать сбои:

  • Разыменование неинициализированного указателя может вызвать сбой
  • Разыменование с использованием недопустимого приведения типов может привести к сбою.
  • Разыменование указателя на переменную, которая была динамически размещена и впоследствии отменена, может вызвать сбой
  • Разыменование указателя на переменную, которая с тех пор вышла из области видимости, также может вызвать сбой.

Недопустимые ссылки чаще приводят к ошибкам компилятора, чем к сбоям, но для этого не стоит полагаться на компилятор.

Рекомендации:

http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators

& is the reference operator and can be read as "address of".
* is the dereference operator and can be read as "value pointed by".

http://www.cplusplus.com/doc/tutorial/pointers/

& is the reference operator    
* is the dereference operator

http://en.wikipedia.org/wiki/Dereference_operator

The dereference operator * is also called the indirection operator.

Ответ 2

Я всегда слышал, как они использовались в противоположном смысле:

  • & является ссылочным оператором - он дает ссылку (указатель) на какой-либо объект

  • * - это оператор разыменования - он принимает ссылку (указатель) и возвращает обратно упомянутый объект;

Ответ 3

Для начала вы имеете их назад: & является ссылкой и * является разыменованием.

Ссылка на переменную означает доступ к адресу памяти переменной:

int i = 5;
int * p;
p = &i; //&i returns the memory address of the variable i.

Выделение переменной означает доступ к переменной, хранящейся по адресу памяти:

int i = 5;
int * p;
p = &i;
*p = 7; //*p returns the variable stored at the memory address stored in p, which is i.
//i is now 7

Ответ 4

найдите следующее объяснение:

int main()
{
    int a = 10;// say address of 'a' is 2000;
    int *p = &a; //it means 'p' is pointing[referencing] to 'a'. i.e p->2000
    int c = *p; //*p means dereferncing. it will give the content of the address pointed by 'p'. in this case 'p' is pointing to 2000[address of 'a' variable], content of 2000 is 10. so *p will give 10. 
}

заключение:

  • & [адресный оператор] используется для ссылки.
  • * [оператор звезды] используется для удаления ссылок.

Ответ 5

привязка

& является оператором ссылки. Он будет ссылаться на адрес памяти переменной указателя.

Пример:

int *p;
int a=5;
p=&a; // Here Pointer variable p refers to the address of integer variable a.

Разыменование

Оператор разыменования * используется переменной-указателем для прямого доступа к значению переменной, а не к ее адресу в памяти.

Пример:

int *p;
int a=5;
p=&a;
int value=*p; // Value variable will get the value of variable a that pointer variable p pointing to.

Ответ 6

Контекст, в котором находится *, иногда путает значение.

  // when declaring a function
int function(int*); // This function is being declared as a function that takes in an 'address' that holds a number (so int*), it asking for a 'reference', interchangeably called 'address'. When I 'call'(use) this function later, I better give it a variable-address! So instead of var, or q, or w, or p, I give it the address of var so &var, or &q, or &w, or &p.   

//even though the symbol ' * ' is typically used to mean 'dereferenced variable'(meaning: to use the value at the address of a variable)--despite it common use, in this case, the symbol means a 'reference', again, in THIS context. (context here being the declaration of a 'prototype'.) 


    //when calling a function
int main(){ 
    function(&var);  // we are giving the function a 'reference', we are giving it an 'address'
  }

Таким образом, в контексте объявления типа, такого как int или char, мы будем использовать разыменование '*', чтобы фактически означать ссылку (адрес), что делает его запутанным, если вы видите сообщение об ошибке от компилятора, говорящее: "ожидание char * ', который запрашивает адрес.

В этом случае, когда * следует за типом (int, char и т.д.), Компилятор ожидает адрес переменной. Мы даем ему это, используя оператор ссылки, также называемый оператором адреса '&' перед переменной. Более того, в случае, который я только что составил, компилятор ожидает, что адрес будет содержать символьное значение, а не число. (введите char * == адрес значения, имеющего символ)

int* p;
int *a;   // both are 'pointer' declarations. We are telling the compiler that we will soon give these variables an address (with &).

int c = 10;  //declare and initialize a random variable
//assign the variable to a pointer, we do this so that we can modify the value of c from a different function regardless of the scope of that function (elaboration in a second)

p = c; //ERROR, we assigned a 'value' to this 'pointer'. We need to assign an 'address', a 'reference'.
p = &c; // instead of a value such as: 'q',5,'t', or 2.1 we gave the pointer an 'address', which we could actually print with printf(), and would be something like
//so
p = 0xab33d111; //the address of c, (not specifically this value for the address, it'll look like this though, with the 0x in the beggining, the computer treats these different from regular numbers)
*p = 10; // the value of c

a = &c; // I can still give c another pointer, even though it already has the pointer variable "p"

*a = 10;
 a = 0xab33d111;

Представьте, что каждая переменная имеет позицию (или значение индекса, если вы знакомы с массивами) и значение. Может потребоваться некоторое привыкание, чтобы подумать о каждой переменной, имеющей два значения, одно из которых - это ее положение, физически сохраненное с электричеством в вашем компьютере, и значение, представляющее любое количество или букву (буквы), которые программист хочет сохранить.

//Why it used
int function(b){
    b = b + 1; // we just want to add one to any variable that this function operates on.
} 

int main(){

    int c = 1;  // I want this variable to be 3.

    function(c); 
    function(c);// I call the function I made above twice, because I want c to be 3.

     // this will return c as 1. Even though I called it twice.
     // when you call a function it makes a copy of the variable.
     // so the function that I call "function", made a copy of c, and that function is only changing the "copy" of c, so it doesn't affect the original
}
  //let redo this whole thing, and use pointers

int function(int* b){ // this time, the function is 'asking' (won't run without) for a variable that 'points' to a number-value (int). So it wants an integer pointer--an address that holds a number.
*b = *b + 1; //grab the value of the address, and add one to the value stored at that address
}

int main(){
    int c = 1; //again, I want this to be three at the end of the program
    int *p = &c; // on the left, I'm declaring a pointer, I'm telling the compiler that I'm about to have this letter point to an certain spot in my computer. Immediately after I used the assignment operator (the ' = ') to assign the address of c to this variable (pointer in this case) p. I do this using the address-of operator (referencer)' & '.
    function(p); // not *p, because that will dereference. which would give an integer, not an integer pointer ( function wants a reference to an int called int*, we aren't going to use *p because that will give the function an int instead of an address that stores an int.

    function(&c); // this is giving the same thing as above, p = the address of c, so we can pass the 'pointer' or we can pass the 'address' that the pointer(variable) is 'pointing','referencing' to. Which is &c. 0xaabbcc1122...


      //now, the function is making a copy of c address, but it doesn't matter if it a copy or not, because it going to point the computer to the exact same spot (hence, The Address), and it will be changed for main version of c as well.

}

Внутри каждого блока он копирует переменные (если они есть), которые передаются (через параметры внутри "()" s). Внутри этих блоков изменения в переменной вносятся в копию этой переменной, переменная использует те же буквы, но находится по другому адресу (из оригинала). Используя адрес "ссылка" оригинала, мы можем изменить переменную, используя блок вне main или внутри дочернего элемента main.