Cの基本型

だから、すばやく、奇妙な質問: 私は試験を受けました。質問がありました:

char c = 'A'
char *p =&c
char **p2 = &p
void *v = &p2

次の式の型(int、void *など)を記述します。

  1. &v
  2. p2 + 1
  3. v[0]

私は答えました:

  1. void **
  2. char **
  3. 不法行為

フルクレジットを失った。ポイントを返そうとする前に、誰かから2番目の意見を聞きたかっただけです。

    v はメモリアドレスの void ポインタであったので、 v void ** でした。しかし、 v が参照解除された場合、 char **** になります。

    p2 char ** なので、1を追加すると char ** p>
  1. v [0] は存在しません。

誰かがこの種のばかげた問題で私を助けることができたら、私はとても感謝しています。 ありがとうございました。

4
v を単独で参照解除することはできません(キャストなし)。これにより、最初の点の最後の文は間違っていますが、3番目の答えは正しくなります。
追加された 著者 Seth Carnegie,
あなたが "もしvが逆参照されたならば、" c "の値を得るために逆参照できる型にキャストされた場合"
追加された 著者 Chris Devereux,

2 答え

あなたの回答は、あなたが与えた理由から正しいです( v の参照解除については少し離れていますが、あなたは void *

5
追加された
'あなたは void * 'の意味を逆参照できませんか?潜在的なコンパイル時/実行時のエラー?ちょうどあなたがそれを行うことができると思ったが、無意味なデータを得る。さらに説明してください。それは私がよく分からない点でもあります:)。ありがとう。
追加された 著者 Summer_More_More_Tea,
私は自分の箱を試しました。 sizeof(v [0])は1ですが、 v [0] 。奇妙な。
追加された 著者 Summer_More_More_Tea,
@Summer_More_More_Tea:コンパイラはあなたがすることを許可しません: void * v; ... * v; 。それは単にコンパイルされません。
追加された 著者 Oliver Charlesworth,

p2+1 is a segfault waiting to happen, and v[0] == *(v+0) == *v which is void and therefore invalid. It should be a char** if typecasted.

0
追加された