4

実行中に「インクリメントオペランドとして必要な左辺値」を取得してい*++aます。どこが間違っているのですか?と同等になると思いました*(a+1)。正常に動作しているため、この動作は奇妙*++argvです。助けてください。

#include <stdio.h>

int main(int argc, char *argv[])
{    
  printf("Arg is:  = %s\n", *++argv);

  int a1[] = {1,2,3,4,5,6};    
  int a2[] = {7,8,9,10,11,12};
  int *a[2];

  a[0] = a1;
  a[1] = a2;

  printf("ptr  = %d\n", *++a);

  return 0;
}
4

3 に答える 3

5

aは定数 (配列名) であり、 を実行しても値を変更できません。++aつまり、 に等しくなりa = a + 1ます。代わりに、この試行のために (0 インデックス値をインクリメント)
したい場合があります。接頭辞から接尾辞に変更したことに注意してください。*a = *a + 1*a++++

注:char* argv[]は関数パラメーターとして定義され、型 ( ) のargvポインター変数です。 あなたのコードでは関数パラメータではありません。これはint型()の配列です(配列名は定数です)。関数パラメータでの宣言と通常の宣言が異なることに注意してください。char**char*[]
int* a[]aint*

さらに、++withを使用するargvと、1 つの違いが見つかりました。演算子をa使用してそのサイズを出力すると、もう 1 つの興味深い違いを観察できます。sizeofたとえば、この作業コードを確認してくださいCodepade

int main(int argc, char* argv[]){
    int* a[2];
    printf(" a: %u, argv: %u", sizeof(a), sizeof(argv));
    return 1;
}

出力は次のとおりです。

a: 8, argv: 4

システム内のアドレスサイズは 4 バイトです。出力8aint アドレス型の 2 つの要素で構成される配列のサイズ (aは配列であるため) ですが、 は(はポインターであるため)4のサイズです。argvargv

于 2013-07-09T04:43:03.123 に答える
4

++aa + 1は同等ではありません。++aと同じですa = a + 1。つまり、変更を試み、変更可能な左辺値であるa必要があります。a配列は変更可能な左辺値ではないため、配列を使用することはできません++a

argvパラメータリストの宣言はmain配列ではないため、実行できます++argv。関数のパラメーター リストで宣言を使用する場合a[]、これはポインター宣言のシンタックス シュガーにすぎません。いえ

int main(int argc, char *argv[])

と同等です

int main(int argc, char **argv)

しかし、配列をローカル変数として宣言すると(質問のように)、それは実際にはポインターではなく真の配列です。「増やす」ことはできません。

于 2013-07-09T04:42:49.293 に答える
3

配列はポインターではありません。 a配列です。配列をインクリメントすることはできません。

于 2013-07-09T04:41:16.133 に答える