2

次のコードでは:

#include<stdio.h>

int main(int argc,char *argv[]){
  int index;
  for(index = 0; index < argc; index++) {
    printf("The %d is %s\n",index,argv[index]);
  }
  return 0;
}

宣言からchar *argv[]cdeclはそれが意味すると言っている declare argv as array of pointer to charので、コードは次のように書くべきだと思います: printf("The %d is %s\n",index,*argv[index]);

次のコードとして:

void give_me_ptr(int *ptr){
  printf("the value of ptr is %p\n", ptr);
  printf("the value of ptr is %d\n", *ptr);
}

int main(void){
  int a = 10,index;
  give_me_ptr(&a);
  return 0;
}

それが判明

the value of ptr is 0x7fff76010b48
the value of ptr is 10

私にとっては、ポインタ変数の前に*を追加する必要があることを意味します。

4

4 に答える 4

10

関数ではprintf、フォーマット指定子は、対応する引数として文字列の最初の文字へのポインタ%sを必要とします。これがあなたがそれに合格する理由です。ポインタです。argv[index]argv[index]

を渡し*argv[index]た場合、文字列の最初の文字のみを渡すことになりますがargv[index]、これは正しくありません。%s文字自体ではなく、最初の文字へのポインタが必要です。

于 2012-07-22T06:18:29.890 に答える
4

cスタイルの文字列指定子%sは、文字列の最初の文字への文字ポインタを想定しています。のようなものを呼び出すとprintf()、ポインタから最も近いヌル文字に文字を出力します。

%d一方、実際の整数を想定しており、1へのポインタは想定していません。文字列をargv[index]に向けると、それはに変換されます。これは、ロケーション番号:index*argv+indexの最初の文字へのポインタです。

于 2012-07-22T06:17:45.910 に答える
1

明確にする2つのこと:

1)argvのこの表現を検討してください。

char *argv[] = { "./progname", "arg1", "arg2", NULL };

標準に準拠した実装で提供されているとおりです。これで、argvの各要素はそれ自体が文字列(charポインター)になり、さらにそれらを逆参照する必要はありません。この場合、文字列の最初の文字のみを取得します。

2)プログラムに整数パラメーターが与えられることを期待している場合でも、%d printf指定子を使用しないでください。引数は常に文字列として渡されます

于 2012-07-22T06:19:29.217 に答える
1

これがどのように動作するかです:それはでポインタまたはcharへのprintfポインタを消費しますが、整数で。%p%s%d

[補足:技術的には、として宣言した場合でもargv、タイプはです。ただし、それらは同義です。]char **char * argv[]

于 2012-07-22T06:19:48.640 に答える