-1

質問は、Reek の前述のハンドブックの一部です。変数を取得しました:

h under 1080 address with value 1020
i under 1020 address with value 1080.

andをtoとして扱う場合、式 **h のL-valueandを評価します。私の答えは ですが、講師用ガイドには次のように書かれています。誰が正しくて誰が間違っている?R-valuehipointersintegersR:1020 L:1080R:1080, L:1020

Step by step:
R-value first:
h=1020
*h=*(1020)=1080
**h=*(*h)=*(1080)=1020
L-value:
same, but value is address of value 1020, so 1080.

OK、これが動作するはずのコードです。計画どおりに動作する場合、この場合は **h = h であることが証明されます。

#include <stdio.h>

int main(void)
{
  unsigned int * h;
  unsigned int *i;
  unsigned int ans=0;

  h=&i;
  i=&h;
  printf("h=%u &h=%u i=%u &i=%u\n", h, &h, i, &i);

  ans=*(unsigned int *)*h;
  printf("**h=%u\n", ans);

  *(unsigned int *)*h=1;

  printf("h=%u &h=%u i=%u &i=%u\n", h, &h, i, &i);

  return 0;

}

そして、ここで私が得る出力:

h=3214580856 &h=3214580852 i=3214580852 &i=3214580856
**h=3214580856
h=1 &h=3214580852 i=3214580852 &i=3214580856

最後の行で **h=1; を実行しました。

4

2 に答える 2

3
addr | value
...  | ...
1020 | 1080    <-- i
...  | ...
1080 | 1020    <-- h

コードは次のようになります。

int* h;
int* i;
h = &i; // h pointing to the address of i (= 1020)
i = &h; // i pointing to the address of h (= 1080)

ここでの本当の質問は次のとおりです: 「式の R**h*iを評価する」とはどういう意味*iですか? ...この場合、左辺値と右辺値の違いは何ですか?

「 L -Value および R-Value Expressions」に関する MSDN の記事には、次のようにptr*ptrptr記載されています。ポイントするストレージ領域を指定します。」~ つまり、式を左辺値として見ると、直接*i使用するのと同じです。h~> h== 1020 の値。

また、次のようにも述べています。 ." ~ 言い換えれば (この場合の私の解釈): *ir 値として見る場合、変数のエイリアスとしてではhなく、式自体の値として見る必要があります。*i~>と考えられる理由を説明します&h

于 2013-09-03T14:12:11.560 に答える