编写了一个交换字符串的例程,第一个例程失败,因为第二个例程正确交换。需要知道相同的原因他们似乎做同样的事情不确定为什么第二个完美的工作不是第一个。
第一种方法
void swap(char *str1, char *str2)
{
char *temp = str1;
str1 = str2;
str2 = temp;
}
第二种方法
void swap(char **str1, char **str2)
{
char *temp = *str1;
*str1 = *str2;
*str2 = temp;
}
答案 0 :(得分:5)
简答:第一个函数获取指针的副本,你只需修改这些副本,而不是原始指针实际指向的副本。
更长:第二个函数需要获取指针指向“副本”,而这些指针又会(可能)将地址包含在真实指针的原始位置。在该函数中,您可以更改原始指针指向的内容。
如果我们将指针与int进行比较,则int变量在内存中有一个地址,该内存地址的值是int包含的数字。 int a = 4
,a
有一个地址,其中存储了数字4
。指针同样如此。指针说char *b = "cde"
,b
有一个存储其值的地址。指针包含另一个地址的“值”,在这种情况下是存储字符串“cde”的地址。
首先,您的第一个功能是将str1
或str2
的值,而不是str1
/ str2
的地址发送给自己。如果你发送str1 / str2的地址,如第二个例子所示,你发送的是pointer-to-pointer
(char**
),它会起作用。
答案 1 :(得分:3)
传递给函数的参数总是按C中的值传递,这意味着您在函数外部的参数本身的更改不会反映在函数外部。在第一种方法中,更改函数内的str2
并不会在函数外部更改str2
。在使用**str2
的第二种方法中,额外的*
实际上已到达函数外部以更改str2
指向的内容(以及str1
的相同内容)。因此,更改在函数外部可见。