2012-07-02 50 views
0
int a=5; b=7; 
int *pa=&a, *pb=&b; 

如何交换的一个的值和从交换指针的值即papb(未*pa*pb)b处?两种情况下的结果都不一样?C语言:如何交换指针与交换指向的值不同?

什么时候我们不得不使用指针交换?

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

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

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

回答

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); 
0

使用“[]”表示存储一些值的存储块:

之前交换:

a: [5] 
b: [7] 

交换后:

a: [7] 
b: [5] 

然后访问将使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”场景。

3

之所以选择使用指针交换变量值是因为它避免了复制大量内存。任何内存复制都需要花费时间,以便将内存复制量降到最低,从而使算法运行得更快。

内存复制如何成为问题?

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

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

在你原来的问题,你换2个整数。假设一个整数的宽度是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**被用作字符串交换函数的参数。被交换的字符串的长度是未知的,因为交换值意味着复制内存,长字符串可能会显着降低性能。使用指针意味着交换的性能将保持不变,无论交换的字符串的长度如何。