Ожидание вывода кода со смесью указателей и ссылок - PullRequest
0 голосов
/ 26 ноября 2011

Если у нас есть этот сегмент кода:

char *i="Hello";

cout<<i<<endl;
cout<<*i<<endl;
cout<<&i<<endl;
cout<<*&i<<endl;
cout<<&*i<<endl;
cout<<*i**i<<endl;

Как мы можем ожидать и объяснить вывод, прежде чем непосредственно выполнить код?

1 Ответ

1 голос
/ 26 ноября 2011

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

cout<<i<<endl;

Вы выводите char* (C-строка) i, поэтому печатается Hello (плюс перевод строки).

<Ч />
cout<<*i<<endl;

*i является первым char из i, 'H', и это то, что напечатано.

<Ч />
cout<<&i<<endl;

Это просто напечатает адрес i (char**).

<Ч />
cout<<*&i<<endl;

т. *(&i). Он получит адрес i, как указано выше, даст вам char**, а затем разыменует этот адрес, чтобы получить char*, то есть i. Так что это напечатает так же, как в первой строке.

<Ч />
cout<<&*i<<endl;

т. &(*i). Это будет разыменовывать i, чтобы получить первое char в строке ('H'), а затем получить адрес этого char, чтобы получить char*. То, что char* такое же, как и выше, i.

<Ч />
cout<<*i**i<<endl;

т. (*i) * (*i). Как вы знаете по второй строке, *i равно 'H', а char 'H' имеет десятичное значение 72. При выполнении умножения на char s они будут переведены в int. Таким образом, результатом будет int результат 72, умноженный на 72, который равен 5184.

<Ч />

Поэтому этот фрагмент будет выводить:

Hello
H
<The address of i>
Hello
Hello
5184
...