0
int a=5; b=7;
int *pa=&a, *pb=&b;

a と b の値を交換することは、ポインタの値を交換することとどのように異なりpaますpbか? どちらの場合も結果は同じではありませんか?*pa*pb

いつポインタースワッピングを使用する必要がありますか?

本には、文字列の配列、つまりchar*[] とのポインター交換を使用する例があります。これは、ソートメカニズムの一部として行われます。スワッピング関数はchar* []、文字列を格納する型変数のポインタのスワッピングを実行します。関数 swap の形式が である理由がわかりませんvoid swap(char** , char**)

これについての説明が他に見つからないので、私の質問です。

swap(int*& a, int*& b):(と比較してどうですかswap(char** a,char** b)

4

3 に答える 3

3

ポインタを使用して変数値を交換することが好ましい理由は、大量のメモリのコピーを回避するためです。メモリコピーには時間がかかるため、メモリコピーの量を最小限に抑えると、アルゴリズムの実行が速くなります。

メモリのコピーはどのように問題になりますか?

次の擬似コードを検討してください。これは、任意のタイプの2つの値をインプレースで交換できます。

tempValue = value1;      /* first memory copy */
value1    = value2;      /* second memory copy */
value2    = tempvalue;   /* third memory copy */

元の質問では、2つの整数を交換しました。整数の幅が4バイトであるとすると、上記の擬似コードは3回のコピー操作で2つの整数を交換します。コピーされた合計メモリ:12バイト。ポインタの幅も4バイトであると仮定すると、ポインタ値を交換するには、12バイトのメモリもコピーする必要があります。この場合、値を交換するためにコピーされるメモリの量は、ポインタを交換するのと同じです。この場合、どちらの方法でも同じパフォーマンスが得られます。

ここで、このコードフラグメントについて考えてみましょう。

typedef struct _mystruct
{
    char buffer[128];   /* size of structure becomes at least 128 bytes */

} MYSTRUCT, *PMYSTRUCT;

MYSTRUCT value1, value2;

PMYSTRUCT pValue1 = &value1;
PMYSTRUCT pValue2 = &value2;

のサイズMYSTRUCTは少なくとも128バイトです。上記の擬似コードを使用してとの値を交換するには、128バイトの3つのメモリコピー、つまり合計384バイトが必要にvalue1なります。value2一方、2つのポインターを使用して値をスワップし、ポインターの幅が4バイトであるpValue1と仮定するとpValue2、スワップ中にコピーされるバイト数は上記の整数の例と同じです。わずか12バイト。これは、ポインタを使用しない場合の384バイトと比較すると、非常に高速で、パフォーマンスが大幅に向上します。

そのchar**ため、文字列交換関数のパラメータとして使用されます。スワップされる文字列の長さは不明です。値のスワップはメモリのコピーを意味するため、長い文字列はパフォーマンスを大幅に低下させる可能性があります。ポインタを使用するということは、スワップされる文字列の長さに関係なく、スワッピングのパフォーマンスが同じままであることを意味します。

于 2012-07-02T04:57:03.577 に答える
1

swap(int*& a, int*& b)C ではなく C++ であり、実際のポインタではなく参照渡しです。この例では、ポインターの受け渡しや変数の受け渡しが理解できません。

2 つの整数と 2 つの文字列をどのように交換するかを考えてみましょう。

int a=10, b=20; 
char *s1="ABC", *s2="PQRS";
swap_int(a, b);
swap_str(s1, s2);
于 2012-07-02T04:24:44.357 に答える
0

「[ ]」を使用して、値を格納するメモリ ブロックを示します。

交換前:

a: [5]
b: [7]

交換後:

a: [7]
b: [5]

次に、a にアクセスすると、7 が返されます。

交換前:

pa: [&a] (that is, the address of a)
pb: [&b]

交換後:

pa: [&b]
pb: [&a]

次に、pa にアクセスすると b のアドレスになり、逆参照 (*pa) すると b の値が取得されます。

char **の場合、あなたが説明するソート手順は、Cの古典的な文字列である「char *」の配列をソートすることだと思います。「char 」エンティティは「string」オブジェクトとして見ることができます。また、「char *」は「string *」であり、「string」オブジェクトの配列と見なす必要があります。次に、上記の「a」と「b」のシナリオのように、並べ替えに関連する割り当てを表すことができます。

于 2012-07-02T04:27:18.927 に答える