2015-06-18 4 views
0

В следующей функции,В чем разница между `* a =` и `= * a`?

void swap(int * a, int * b) { 
    int t; 
    t = *a; // = *a 
    *a = *b; // a* = 
    *b = t; 
} 

В чем разница между = *a и *a =?

Я слышал, что * оператор в = *a является де-ссылки (или в режиссуры) оператор, который Fetches (?) это значение из указателя.

Тогда, каково фактическое значение *a =?


Вчера, на следующий день я задал этот вопрос, я объяснил про указатели на мой коллега, основная область не имеет ничего общего с указателями.

Я быстро напечатал исходный код, как это.

#include <stdio.h> 

void swap1(int a , int b) { 
    int t = a; 
    a = b; 
    b = t; 
} 

void swap2(int * a, int * b) { 
    int t = *a; 
    *a = *b; 
    *b = t; 
} 

int main(int argc, char * argv[]) { 
    int a = 10; 
    int b = 20; 
    swap1(a, b); 
    swap2(&a, &b); 
} 

Я даже горжусь собой для запоминания вещей, запечатленных на мой мозг в 1996 году (я был с Java в течение почти 20 лет.) я использовал кучу printf с с %d с и %p чтобы показать ей, что происходит.

Тогда я сделал ужасная ошибка. I указанный.

포인터 변수 앞에 을 붙이면 값 을 가져온다 는 뜻 이에요.

Когда вы прикрепляете STAR перед указателем указателя, это означает, что вы извлекаете (извлекаете) значение.

Ну, что может быть применено к следующему утверждению.

int t = *a; 

который просто можно сказать,

int t = 10; 

Большая проблема, которую я столкнулся пришел из второго утверждения.

*a = *b; // 10 = 20? 

Корень зла в том, что я не пытался объяснить о dereference operator или я не просил себе быть в курсе смысла в 별 (звезда).

Вот что скажут люди.

для = *a,

фактического значения по адресу, обозначенного a назначен на левую сторону.

для *a =

величина правой части хранится в адрес, обозначенном a.

Вот что я сбиваю с толку. И именно поэтому я должен переосмыслить смысл «де-ссылки».

Спасибо за ответы.


О, я думаю, что эта проблема будет глубже понятий lvalue с и rvalue с.

+2

Кажется, что снова время для Бинки: http://cslibrary.stanford.edu/104/ – alk

ответ

2

Здесь:

t = *a; 

указатель a разыменовывается и это значение присваивается t тогда как здесь:

*a = *b; 

как b и a разыменовываются и значение *b хранится в адрес a.

3

Первый считывает из памяти a указывает на. Второй - это запись в эту память.

Это не отличается от x = и = x, за исключением того, что вы не имеете доступа к переменной напрямую, а к объекту, на который она указывает.

1

Это не имеет никакого отношения к «=» оператор .Это (оператор *) просто означает, что значение в «а это address.So

t = *a; assigns value at address a to t 
*a = *b; assigns b's value in place of value at address a 
*b = t; assigns t to b's value 
1

a является указателем здесь, указывает на междунар.

*a извлекает целочисленное значение, хранящееся в памяти, на которое указывает a. Когда вы говорите *a = <some value>, предполагая, что <some value> будет int, <some value> хранится в ячейке памяти, на которую указывает a.

*a = *b ==> Здесь Ь снова указатель ИНТ, поэтому целое значение указывает b считывается и записывается в ячейку памяти, на которую указывает a.

1

Я слышал, что оператор * in = * a является оператором de-referencing (или in-directing), который извлекает (?)

Фактическое извлечение происходит, когда вы разыскиваете указатель с оператором *. Следовательно, оператор назначения = не предполагает разыменования, возможно, присваивая разыменованное значение LHS.

1

В чем разница между = * a и * a =?

Ну ... посмотрите на этот код:

int x; 
t = x; 
x = t; 

Если у вас есть какие-либо простой переменной int x;, то вы можете читать из него и писать в него. В этом разница между двумя вашими линиями.

* является оператором «содержимого». Если a является указателем на int, то *a просто означает, что вы можете использовать содержимое этой переменной, как если бы она была простой переменной int. И точно так же, как любая переменная, вы можете читать или писать.

 Смежные вопросы

  • Нет связанных вопросов^_^