C语言 : How is swapping pointers different from swapping the value pointed to?

标签 c pointers swap

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

交换 a 和 b 的值与交换指针的值有何不同,即 papb (不是 *pa*pb )?两种情况下的结果不一样吗?

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

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

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

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

最佳答案

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

内存复制如何成为一个问题?

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

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 字节。另一方面,如果我使用两个指针 pValue1pValue2 交换值,假设指针为 4 字节宽,则交换期间复制的字节数为与上面的整数示例相同;只有 12 个字节。与不使用指针的 384 字节相比,这非常快并且性能会更好。

这就是为什么 char** 被用作字符串交换函数的参数的原因。被交换的字符串的长度是未知的,并且由于交换值意味着复制内存,长字符串可能会大大降低性能。使用指针意味着无论交换的字符串长度如何,交换的性能都将保持不变。

关于C语言 : How is swapping pointers different from swapping the value pointed to?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287716/

相关文章:

c - 在 Arduino 中使用 PROGMEM 存储在闪存中的字符串数组

c++ - 具有函数指针的类,可以在不同实例中调用多种函数

c++ - 设置一个指针指向用户输入 C++

list - 交换 Lisp 列表中的元素

c - 先不重复字码

c - 包含的 C 文件中的 Pragma

c++ - 图像处理 - 这是一个 for 循环问题吗?

java - 选择排序中的交换

python - 重新排序十六进制字符串中的字节顺序(python)

c - 尝试遍历整个内存空间,过早重置地址变量