编写了一个例程来交换字符串,第一个例程失败,因为第二个例程正确交换.需要知道相同的原因他们似乎做同样的事情不知道为什么第二个完美的工作不是第一个.
第一种方法
void swap(char *str1, char *str2)
{
char *temp = str1;
str1 = str2;
str2 = temp;
}
Run Code Online (Sandbox Code Playgroud)
第二种方法
void swap(char **str1, char **str2)
{
char *temp = *str1;
*str1 = *str2;
*str2 = temp;
}
Run Code Online (Sandbox Code Playgroud)
简短回答:第一个函数获取指针的副本,您只需修改这些副本,而不是原始指针实际指向的副本.
更长:第二个函数需要获取指针指向"副本",而这些指针又会(可能)将地址包含在真实指针的原始位置.在该函数中,您可以更改原始指针指向的内容.
如果我们将指针与int进行比较,则int变量在内存中有一个地址,而该内存地址的值是int包含的数字.int a = 4,a有一个4存储号码的地址.指针同样如此.指针说char *b = "cde",b有一个存储它的值的地址.指针包含作为另一个地址的"值",在这种情况下是存储字符串"cde"的地址.
所以在你的第一个函数中发生的是你发送的值,str1或者str2不是地址给str1/ str2他们自己.如果你发送str1/str2的地址,如第二个例子所示,你发送一个pointer-to-pointer(char**),它将工作.