1

私は現在 c 言語を学んでいて、このコードに出くわしました。ptr はすでに変数のポインター型であるため、演算子の影響は何ですか&。通常、演算子は非ポインター変数のアドレスを取得するために使用することがわかっています。

struct name {
  int a; float b; char c[30];
};
int main()
{
  struct name *ptr;
  int i,n;
  printf("Enter n: ");
  scanf("%d",&n);
  ptr = (struct name*)malloc(n*sizeof(struct name));
  /* Above statement allocates the memory for n structures with pointer ptr pointing to       base address */ 
  for(i=0; i<n; ++i) { 
    printf("Enter string, integer and floating number respectively:\n");
    scanf("%s%d%f", &(ptr+i)->c, &(ptr+i)->a, &(ptr+i)->b); 
  }
}
4

4 に答える 4

2
&(ptr + i)->c

これは、ptr の i 番目の要素に格納されている変数 c のアドレスを取ります。ですから、あなたの最初の直感は正しかったのです。

ptr+i

配列の i 番目の要素を見つけるための算術ポインタです。

(ptr+i)->c

cその構造体からフィールドにアクセスし、&その変数のアドレスを取得します。

于 2013-10-02T15:29:40.753 に答える
2

このコードは、リスト内の i 番目の構造体に属する&(ptr + i)->c構造体要素のアドレスを示します。c少し分解してみましょう。

(ptr + i)ポインタ演算です。に格納されているアドレスに i を追加しptrます。

(ptr + i)->cポインタを介して構造体要素 c にアクセスします(ptr + i)

&(ptr + i)->cポインタを通じて構造体要素 c のアドレスを取得します(ptr + i)

また、アドレス演算子がポインターに適用されていると思っていたので、これはあなたが思っていたこととはまったく違うことを知っていますが、参考までに:実際にポインターのアドレスを取得できます。このような構造はポインターへのポインターであり、関数内でポインター (ポインターが指すアドレスに格納されている値だけでなく) を変更する場合に役立ちます。例えば

int a = 5; /* regular variable */
int* pa = &a; /* pointer to a */
int** ppa = &pa; /* pointer to pointer (which points to a) */
于 2013-10-02T15:33:46.730 に答える
1

&まず、 C および C++ 言語の演算子は、任意の変数のアドレスを取得するために使用されます。より正確には、[ほぼ]任意の左辺値のアドレスを取得するために使用できます(その点でCとC++の間にいくつかの違いがあります)。ポインター変数は通常の変数です。それらについて特別なことは何もありません。つまり、演算子&がポインターに適用されるのを見るのは珍しいことではありません。

&第二に、あなたが提供したコードには、実際にはポインターに適用される単一のインスタンスはありません。コードには の 4 つのアプリケーションがあり&ます

&n
&(ptr+i)->a
&(ptr+i)->b
&(ptr+i)->c

最初の 2 つのケースでは、intオブジェクトに適用されます。3 番目のケースでは、floatオブジェクトに適用されます。最後のケースでは、char [30]オブジェクトに適用されます。ポインターはありません。

于 2013-10-02T15:39:59.530 に答える
0
struct name* ptr;

これにより、へのポインターが作成されますname

struct name** p = &ptr;

これは、name既に作成したポインターのアドレスを取得して、a へのポインターへのポインターを作成します。

あなたの場合、 へのポインターを渡し、scanfの動的配列を持っているnameので、

&(ptr + i)->c

配列の i 番目の要素を検索し、そのcメンバのアドレスを toに返します (および とscanf同じ)。ab

ポインターのアドレスを渡すと、そのポインターを変更できます (再割り当てなど)。C++ では、参照渡しとほぼ同じです。

于 2013-10-02T15:31:00.340 に答える