原始函数版本
void swap(char *str1, char *str2)
{
char *temp = str1;
str1 = str2;
str2 = temp;
}
在这个版本中,str1
和 str2
是函数参数,它们是传入的指针(即地址)的副本。这意味着:
- 传递给
swap
函数的是指向字符的指针的副本。 - 在函数内部,
str1
和str2
这两个指针会暂时持有原始字符数组的地址,但是对它们的修改(如将它们的地址更改到其他地方)不会影响调用者传入的实际指针。 - 换句话说,原始调用者的指针所指向的地址并没有被改变,仅仅是在函数的局部范围内重定向了指针。
使用双重指针版本
void swap(char **str1, char **str2)
{
char *temp = *str1;
*str1 = *str2;
*str2 = temp;
}
在这个版本中,str1
和 str2
是指向指针的指针,即双重指针。这意味着:
- 传递给
swap
函数的是指向指针的指针的副本。 - 这些双重指针所指向的实际上是真正的指针变量本身,而不仅仅是它们指向的字符串内容的地址。
- 因为传递的是指针的地址,所以在函数内部通过
*str1
和*str2
可以修改原始指针指向不同的字符串。 - 实际上,这一修改影响到了调用者,因为它改变了原始指针变量的值,而不仅仅是它们所指向的内容。
因此,使用双重指针可以改变调用者指针本身的目标,而简单地使用单指针只能在函数范围内改变指向,但不会影响原始调用者的指针。