2

非常に簡単です。私は C++ を再学習しており、ポインターを使用しています。基本的なコンセプトは理解していますが、少し問題があります。この関数を呼び出すための構文は何ですか?

void getTime(int& hours, int& minutes, int& seconds) const
{
    hours = hr;
    minutes = min;
    seconds = sec;
}

おそらくご想像のとおり、この関数のポイントは、関数呼び出しが含まれるスコープにある 3 つのポインターに時、分、秒の時間を返すことです。hr、min、および sec が既に定義されていると仮定します。 .

また、誰かがポインターについて少し詳しく説明したい場合 (特に & を使用する場合と * を使用する場合)、それは大歓迎です。少し早いですがお礼を。

4

4 に答える 4

6

あなたの関数シグネチャは&、参照渡しを示す を使用しています。これは、関数を次のように呼び出すだけであることを意味します。

int h, m, s;

// ... code ...

getTime(h, m, s);

関数は参照によってこれらの引数を渡すため、getTime()渡された引数の 1 つを変更するたびに、変更が関数のスコープに制限されている値によって渡された引数とは対照的に、変更は関数の外部に伝播します。

代わりに変数へのポインターを渡すことで、同様の効果を得ることができます。

void getTime(int * hours, int * minutes, int * seconds)
{
     // do stuff
}

// ... code ...

int h, m, s;
getTime(&h, &m, &s);

後者のコンテキストでは、&アドレス取得演算子です。渡されたアドレスを逆参照することにより、関数はその関数スコープ外のメモリに変更を加えることができます。

于 2013-01-02T02:44:51.003 に答える
4

関数を呼び出すための構文は次のようになります。

className.getTime(a, b, c);

はこのメソッドclassNameを定義したクラスの名前で、ab、およびcはすべて整数への変数です。パラメータ リストのアンパサンド&は、変数が値を変更できることを意味します。これがないと、パラメーターを変更できますが、対応する引数は変更されません。私が見ることができる場所からではなく、ここではポインターの使用はありません。

たぶん、単項とパラメータの単項 を混同しているのかもしれません。&単項&が行うことは、そのオペランドのメモリ アドレスを返すことです。返されるアドレスはたまたまポインターです。ただし、これはあなたの例とは関係ありません。

ポインターを使用する場合は、次のような関数シグネチャを使用する必要があります。

void getTime(int* a, int* b, int* c) const

*ここでは、関数がポインターを取ることを意味します (単項*は逆参照です)。次のように呼び出します。

int *a, *b, *c;

getTime(a, b, c);

またはこのように:

int a, b, c;

getTime(&a, &b, &c);

違いは、最初の例の変数はポインターであるため、アドレスを渡す必要がないことです。2 番目の例では、オブジェクトへのポインターを生成するため、アドレスを渡す必要があります。

于 2013-01-02T02:43:57.037 に答える
1

ここにあるのはポインターではなく、参照です。両者にはいくつかの重要な違いがあります。まず、参照を にすることはできませんNULL。初期化されたものを指す必要があります。次に、必要な構文が異なります。

例として、ポインターを使用している場合、関数には次のシグネチャがあります。

void getTime(int* hours, int* minutes, int* seconds) const
{
    hours = &hr;
    minutes = &min;
    seconds = &sec;
}

次に、次のように呼び出します。

int hours, minutes, seconds;
hours = minutes = seconds = 0;
getTime(&hours, &minutes, &seconds);

参照は同様の方法で動作します。つまり、参照は、渡された基になる引数を変更したり、コピーを回避したりするために使用されます。ただし、構文は異なります。

int hours, minutes, seconds;
hours = minutes = seconds = 0;
getTime(hours, minutes, seconds); //Notice & not required

それぞれをいつ利用しますか?一般に、可能な場合は参照を使用し、必要な場合はポインターを使用します。最新の C++ では、ポインタは他の構造を優先して避けられることがよくあります。ポリモーフィズムや、コンテナーに配置された値の直接変更などには、依然として必要です (ただし、これは現在の状況よりも進んでいる可能性が高いですが、これが意味をなさない場合は、今のところ無視してください)。

クラスまたはラージ オブジェクトを渡すときは、const への参照を使用します。したがって、たとえば astd::vectorは通常 として渡されvoid some_func(const std::vector<int>& v)ます。本当に変更する必要がある場合は、参照渡し、void some_func(std::vector<int>& v).

于 2013-01-02T02:49:55.080 に答える
0

あなたの質問にはポインタはありませんが、参照があります。この関数は、通常の引数を取る場合とまったく同じように呼び出されます。つまり、次のようになります。

//assuming an object called object that possesses the function:
//I am assuming its a object-function because of the 'const' modifier

int h, m, s;

object.getTime(h,m,s);

ポインタと参照の違いを簡単に説明します。

ポインターは、別の変数のメモリ アドレスを格納し、*文字と共に宣言されます。それらの値は、別の変数のコンピューター メモリ内の位置を表す整数です。この値にアクセスするには、演算子 (文字も)を逆参照する必要があります。*

int * p; //p stores the location in memory of an int.
p = new int; //pointers must be dynamically allocated to avoid segfaults
p = &(some pre-existing int) //or set to the reference of another variable

*p = 7;//The * is used to access the data the pointer "points to"
delete p; //and must be deleted once they are done being used.

参照は、通常のデータを含むという点で通常の変数に似ていますが、関数に渡されるときに同じメモリ位置を維持するという点で異なります (これにはさらに多くの可能性があります。参照がこの問題で動作することは知っていますが、他の定義):

int& i; //i is an int.
i = 7; //and can be assigned like one
//and cannot be dynamically allocated or deleted

お役に立てれば。

于 2013-01-02T02:48:50.073 に答える