6

char配列を指すacポインタがインクリメントされると、その配列の次の要素を指すと思いました。しかし、これを試してみると、2回インクリメントする必要があることがわかりました。sizeof(char) を使用してインクリメントを試みると、char のサイズを追加するのは大きすぎるため、2 で割る必要があることがわかりました。

#include <stdio.h>

int main(int argc, char * argv[]){
   char *pi;
   int i;
   pi = argv[1];
   printf("%d args.\n",argc-1);
   printf("input: ");
   for(i=0;i<argc-1;i++){
      printf("%c, ",*pi);
      /*The line below increments pi by 1 char worth of bytes */
      //pi+=sizeof(pi)/2;
      /* An alternative to the above line is putting pi++ twice - why? */
      pi++;
      pi++;
   }
   printf("\n");
   return 0;
}

私は何か間違ったことをしていますか?または、ポインタをインクリメントする方法を誤解していますか?

4

3 に答える 3

20

sizeof(char) は 1 であることが保証されていますが、sizeof(char*) はそうではありません。

それにもかかわらず、あなたの機能は偶然にしか機能しません

たとえば、次のパラメーターを使用して呼び出してみてください。

abc defg

これにより、次の結果が得られます。

2 args.
input: a, c,

これは明らかに間違っています。問題は、argv へのポインターではなく、argv の要素 1 へのポインターをインクリメントしていることです。

これを試して:

#include <stdio.h>

int main(int argc, char * argv[]){
   char **pi;
   int i;

   pi = argv + 1;
   printf("%d args.\n",argc-1);
   printf("input: ");
   for(i=0;i<argc-1;i++){
      printf("%c, ",**pi);
      pi++;
   }
   printf("\n");
   return 0;
}

これにより、すべての引数の最初の文字が出力されます。

2 args.
input: a, d,
于 2008-11-23T16:02:07.337 に答える
4

ptrタイプのポインタがT*あり、 を追加すると、ポインタはまたは同等のバイト分N進みます。を逆参照するのを忘れただけです。したがって、得られたのは の sizeof でしたが、 の sizeof ではありません。あなたの行は、あなたのプラットフォームのポインターは 4 バイトの大きさと同等でした。したがって、事実上、あなたはそうしました。2倍にしたい場合に書きます。定義により sizeof が 1 であることに注意してください。する必要はありません。常に 1 です。N * sizeof (*ptr)N * sizeof (T)pisizeof (pi)char*charpi+=sizeof(char*)/2;pi+=2;pi+=2charsizeof (char)

于 2008-11-23T15:59:36.403 に答える
3

sizeof(pi) は (char*) のサイズを返します。これは pi の型です (ポインター、おそらく 2、4、または 8 バイト)。sizeof(char) は 1 を返します。

ただし、理解すべきもう 1 つのことは、ポインターを数値でインクリメントするときはいつでも (例: pi += sizeof(char); pi++; など)、ポインターを基本サイズでインクリメントしていることです。そう:

int *ipointer = &int_array[0];
ipointer += 2;

実際には ipointer をsizeof int の 2 倍に増やします。

あなたが間違っていると思われるもう1つのことは、最初の引数で pi を指してから、すべての引数をループすることです。引数をループしたい場合は、次のようにしてみてください。

for (i = 1; i < argc; i++) {
    pi = argv[i];
    // ... do something with pi
}
于 2008-11-23T16:02:23.170 に答える