Некоторые основные вопросы C ++ (нуб!) - PullRequest
0 голосов
/ 18 января 2011

Я только начинаю изучать C ++ через мой университетский курс.

Я готовлюсь к экзамену по С ++ и надеюсь, что смогу просто задать несколько простых вопросов о вещах, в которых я не уверен.

Прежде всего, если у меня есть это:

int i = 4;

В чем разница между этими двумя строками:

int* p = &i;
int& r = i;

Насколько я понимаю, в этот момент p и r подобны каналам к i; изменение их значения изменит значение i ...


Во-вторых, по поводу сборки у меня есть вопрос на прошедшем экзамене, который меня обманывает:

mov eax, dword ptr[b]
push eax
mov eax, dword ptr[a]
push eax
call printCode (411186h)
add esp,8 

В: Какой из следующих прототипов в разобранном виде лучше всего код сборки?

A: int printCode (int a, int b)

У меня такой вопрос: если сборка движется ptr [a] и ptr [b] ... Почему прототип не int * a, int * b?


Спасибо.

Ответы [ 5 ]

2 голосов
/ 18 января 2011

Разница в том, что изменение p значения не будет изменять i, оно изменит то, на что p указывает:

p = &j;

С p вы можете получить доступ и изменить i через косвенное обращение:

*p = 5;

Принимая во внимание, что с r косвенное указание не требуется, поскольку r является псевдонимом для i. С другой стороны, это означает, что нет способа изменить r для ссылки на другую переменную. т.е. нет эквивалента p = &j;.


Вы должны разбить второй вопрос на второй (если вы меня поняли).

1 голос
/ 18 января 2011
int* p = &i;
int& r = i;

Первый оператор означает присвоение адреса переменной i указателю p.Здесь позже вы можете изменить значение указателя p.

Второй оператор - «создать ссылку или псевдоним r для переменной i».Это просто другое имя для той же переменной.Позже вы не сможете изменить ссылку, чтобы она указала на другую переменную в c ++.

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

printCode(*a,*b); // Here a and b are pointer to integers 

Так что прототип

int printCode(int a,int b) 

прав.

Феросе Хан J

1 голос
/ 18 января 2011
  • int* p = &i;

    p - указатель, указывающий на адрес i.p будет переменной, хранящейся в вашей памяти, которая содержит (виртуальный) адрес памяти i.

  • int& r = i;

    r являетсяссылка на i.Вы должны думать о ссылках как о псевдонимах: вы можете подумать, что r - это псевдоним имени i

    Я бы предложил вам прочитать C ++ Faq главу о ссылках .

0 голосов
/ 18 января 2011

В чем разница между этими двумя строками:

int* p = &i;
int& r = i;

Насколько я понимаю, в этот момент p и r подобны каналам к i; изменение их значения изменит значение i ...

Предложение неверно, если понимать его буквально. Изменение значения p приведет к тому, что оно будет указывать только на другое значение int, изменение памяти , указывающее на , изменит i:

int j = 0;
*p = 5; // equivalent to r = 5, or i = 5 (semantically, can be different in assembler)
p = &j; // changes p to point to j instead of i

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

0 голосов
/ 18 января 2011

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


По вопросу разборки.
Когда вы говорите:

mov eax, dword ptr[b]

Вы просите CPU переместить значение с указанного адреса (b). Так что это зависит от того, что б. Если b является int*, то ответ правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...