0

教科書で次のコードを見つけました。

#include<stdio.h>

void disp( int *k)
{
printf("%d",*k);
}

int main( )
{
 int i ;
 int marks[ ] = { 55, 65, 75, 56, 78, 78, 90 } ;
 for ( i = 0 ; i <= 6 ; i++ )
 disp ( &marks[i] ) ;
 return 0;
}

 }

コードは問題なく動作しますが、ロジックに関して疑問があります。

  1. 配列の変数のアドレスを送信しています。しかし、disp関数では、ポインター変数を引数として使用し、ポインターの値を出力しています。そのため、関数から送信される引数の型は、mainの引数と一致しない必要がありますdisp。それで、それはどのように機能しますか?

  2. disp関数を次のように変更して同じことを試みました

    void disp( int (&k))
    {
    printf("%d",*k);
    }
    

    しかし、私はエラーが発生しています。アドレスを引数として使用して機能させるにはどうすればよいvoid disp(int &k)ですか?

4

5 に答える 5

5

1) 配列の変数のアドレスを送信しています。しかし、disp 関数では、ポインター変数を引数として使用し、ポインターの値を出力しています。

ポインタがアドレスであることを理解してください。もそう&marks[i] ですint*。また、ポインターの値を出力するのではなく、ポインターが指す値を出力します。

printf("%d",*k);

*kポインターを逆参照し、ポイント先の値を提供します。

void disp( int (&k))

は C の無効な構文で&kあり、有効な識別子ではありません。

于 2012-10-18T12:51:00.820 に答える
3

あなたがするとき:-

int *k = &marks[i];

上記のステートメントは次のように分割されます。

int *k;   -> Integer Pointer
k = &marks[i]; --> `k` points to the address of marks[i]

したがって、基本的にkは、integerの現在の要素のアドレスを指すポインタarrayです。

したがって、を出力すると*k、次と同等になり*(&marks[i])ます。-、値を逆参照して要素を出力しますmarks[i]

したがって、以下のコードでは、pointer割り当てのプロセス全体がどのようにde-referencing行われるかを理解できます。

int *k;  // Declaring integer pointer.

// Actually 'k' is equal to the `&marks[i]`. 
// '*k' is just the indication of it being a pointer
k = &marks[i];      

// Dereference pointer
*k = *(&marks[i]); -->  = marks[i]

printf("%d",*k);  --> printf("%d",marks[i]);

また、次のような変数を宣言することはできないため、-

int &k = &marks[i];

関数のパラメーターとしてそれらを使用することはできません:-

void disp(int &k);

なぜなら、最終的にarray element渡されたアドレスはこの変数に格納されるからです。だから、それはでなければなりませんint *k

于 2012-10-18T12:53:15.617 に答える
1

1)forループでアドレスがに送信されることを正しく理解していますdisp。しかしdisp、引数としてポインタを受け取ります...これは単なるアドレスです。その関数内では、ポインタの「値」を出力しません。そのポインタが指す値(そのアドレスにある値)を出力します。printf呼び出し「*k」では、ポインターを逆参照します-そのポインターが指す値を取得します。

2)アドレスを受け取るように関数を変更していません。参照を受け取るように変更しました。また、非表示のポインターを受け取ると言うこともできます-ポインターと同じように機能しますが、逆参照するために「*k」する必要はありません-通常の変数として使用します

于 2012-10-18T12:56:32.490 に答える
0

さて、単純に私はあなたが関数でアドレスを渡し、それをポインタで受け取っていると言うことができます..ポインタはアドレスを指しているか保持することができるのでそれは正しいです。または、アドレスを送信し、それを参照変数に格納しているが、誰の参照であるかを尋ねるだけの場合もあります。逆に試してみると、構造がよりよく理解できます...

于 2012-10-18T12:54:39.087 に答える
0

ポインターと変数のアドレスを調べます。そして、それらがどのように使用されているか。関数がポインターを予期する場合、ポインターまたは変数のアドレスのいずれかを送信する必要があります。ポインタはアドレスを保持するため。

直面している 2 番目の問題は、構文エラーの問題です。「左辺値」に適用できる & 演算子がないためです。

于 2012-10-18T12:51:22.560 に答える