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

交换 a 和 b 的值与交换指针的值 ie paand pb(not *paand *pb) 有何不同?两种情况下的结果不一样吗?

我们什么时候必须使用指针交换比?

我在书中有一个例子,它使用指针与字符串数组交换,即char*[]。这是作为排序机制的一部分完成的。char* []交换函数对存储字符串的类型变量进行指针交换。我不明白为什么函数 swap 是 form void swap(char** , char**)

我在其他地方找不到任何解释,因此我的问题。

swap(int*& a, int*& b):(相比如何swap(char** a,char** b)

4

3 回答 3

3

首选使用指针交换变量值的原因是因为它避免了复制大量内存。任何内存复制都需要时间,因此将内存复制量保持在最低限度可以使算法运行得更快。

内存复制如何成为问题?

考虑以下伪代码,它可以就地交换任何类型的两个值:

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

在您最初的问题中,您交换了两个整数。假设一个整数的宽度是 4 个字节,那么上面的伪代码将在三个复制操作中交换两个整数。复制的总内存: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 字节。使用上面的伪代码来交换 和 的值value1value2需要三个 128 字节的内存副本,或总共 384 字节。另一方面,如果我使用两个指针pValue1和交换值pValue2,假设指针是 4 字节宽,则在交换期间复制的字节数与上面的整数示例相同;只有 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 **,我认为您描述的排序过程是对“char *”数组进行排序,这是 C 中的经典字符串。您可以将“char ”实体视为“字符串”对象。而“char * ”是“string *”,应该被认为是“string”对象的数组。然后,您可以描述排序中涉及的分配,如上面的“a”和“b”场景。

于 2012-07-02T04:27:18.927 回答