-3

printf("%d",*(++(*a)));未定義ですか?aこれは、整数へのポインターへのポインターです。

これ以外のコードはもうありません。これは、多くの混乱を引き起こしたこの質問の延長です。このプリントで何が起こっているのか知りたいだけです。アーキテクチャ(32対64)またはコンパイラのバージョンに依存しますか。

答えが説明的で明確であることを願っています。

4

3 に答える 3

12

分解すると、次のようになります。

  1. 指しているを取得します。a*a
  2. 1ずつ増加++(*a)
  3. それを逆参照する*(++(*a))

したがって、 格納されている値の+1aが有効なポインターである場合、これは機能します。それ以外の場合、結果は未定義であり、実行時エラーが発生する可能性が高くなります。

于 2013-07-09T06:48:01.713 に答える
3

はい、あなたのコードは正しいです。

void print_next(int **a) {
   printf("%d\n",*(++(*a)));
}


int arr[] = {1,5,6,3,5,6};
int *p = arr;

while (p<arr+6) 
   print_next(&p);
于 2013-07-09T06:56:11.703 に答える
2

質問が特に*(++(*a))式に関するものである場合、ここで未定義のものはありません (関連するすべてのポインターが有効であると仮定します)。同じオブジェクトの複数の変更を実行しようとする試みはありません。変更されたオブジェクトの独立した読み取りはありません。話の終わり。

基本的に、ここで説明することは何もありません。コードはかなり単純な方法で完全に優れているからです。それ以上に「説明的で明確」なものを入れる余地は本当にありません。

これが十分に明確でない場合は、この表現で疑わしいと思われるものを正確に説明する必要があります。

于 2013-07-09T06:57:10.910 に答える