5

tに値を割り当てる前に、次のコードで初期化する必要がありますtか?コードは正しいですか?

void swap(int *x, int *y)
{
    int *t;
    *t = *x;
    *x = *y;
    *y = *t;
}
4

7 に答える 7

9

最初にポインタは必要ありません:

void swap(int *x,int *y)
{
    int t; //not a pointer!
    t=*x;
    *x=*y;
    *y=t;
}
int a = 10, b = 20;
swap( &a, &b); //<-----------note : Needed &

-

または、次のスワップ関数が必要な場合もあります。

void swap(int & x,int & y) //parameters are references now!
{
    int t; //not a pointer!
    t=x;
    x=y;
    y=t;
}
int a = 10, b = 20;
swap(a,b); //<----------- Note: Not needed & anymore!
于 2011-03-23T10:35:43.357 に答える
8

コードの次のセクションは正しいですか?

いいえ!ワイルドポインタを逆参照しようとしているため、コードは未定義動作を呼び出します。

 int *t;
 *t=*x; // bad

むしろこれを試してください

 int t; // a pointer is not needed here
 t=*x; 

またはこれ

int *t = x; // initialize the pointer

于 2011-03-23T10:35:16.410 に答える
5

そのコードには未定義の動作が含まれています。

int *t;
*t=*x; // where will the value be copied?

それに加えて、それは意味がありません-ポインタではなく、値を格納するための一時変数が必要です。

int t; // not a pointer
t=*x;
*x=*y;
*y=t;
于 2011-03-23T10:35:28.693 に答える
1

ポインタとしては正しいです。

宣言時に(またはインスタンスメンバーのコンストラクターで)参照のみを初期化する必要があります。

編集:しかし、コードにエラーが発生した場合は、パラメーターを逆参照しないでください(つまりint *ptr = otherPtr;、問題ありませんint *ptr = *otherPtr;) 。

于 2011-03-23T10:35:51.980 に答える
1

ポインタがすでに初期化されているデータを指すようにしたいだけの場合は、データを初期化する必要はありません。ただし、その方法では、malloc関数の1つを使用して、整数に十分なヒープスペースを割り当てたいと考えています。

C / C ++でスワッピングを行うための適切で効率的な方法は、次のとおりです。

void swap(int *x, int *y) {
    int *t = x;
    x = y;
    y = t;
}
于 2011-03-23T10:38:51.490 に答える
1

これを行う正しい方法はここにあります

#include <stdio.h>

void swap(int *i, int *j)
{
    int t;
    t = *i;
    *i = *j;
    *j = t;
}

基本的にその理由はsharptoothによって説明されていますが、そのようなスワップを行うとバックグラウンドで何が起こるかについての詳細と説明があります。それがあなたのアイデアをクリアするのに役立つことを願っています。

于 2011-03-23T10:40:06.367 に答える
0
int *t;
*t=*x;

t逆参照できる有効な場所を指していません。

ポインタtに値を割り当てる前に、を初期化する必要がありますか。

はい、有効なメモリ位置を指すように初期化/割り当てます。そうでなければ、それはどこを指しますか。ガベージを指し示し、間接参照の未定義の動作につながる可能性があります。

于 2011-03-23T10:36:25.863 に答える