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)
的比较。
答案 0 :(得分: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个字节。使用上面的伪代码交换value1
和value2
的值将需要三个128字节的内存副本,或总共384字节。另一方面,如果我使用两个指针pValue1
和pValue2
交换值,假设指针宽度为4个字节,则交换期间复制的字节数与我们的整数示例相同以上;只有12个字节。与未使用指针的384字节相比,这非常快,并且性能会更好。
这就是为什么char**
被用作字符串交换函数的参数的原因。被交换的字符串的长度是未知的,并且因为交换值意味着复制内存,所以长字符串可能会大大降低性能。使用指针意味着无论交换的字符串的长度如何,交换的性能都将保持不变。
答案 1 :(得分:1)
swap(int*& a, int*& b)
不是C而是C ++,它是通过引用而不是实际指针传递的。
在这个例子中,你不会理解传递指针或传递变量。
想想你将如何交换2个整数和2个字符串i,e。
int a=10, b=20;
char *s1="ABC", *s2="PQRS";
swap_int(a, b);
swap_str(s1, s2);
答案 2 :(得分: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 *”,应该被视为“字符串”对象的数组。然后,您可以像上面的“a”和“b”场景一样描述排序中涉及的任务。