字符串交换适用于char **但不适用于char *

在这个程序中,我交换了前两个名字

#include void swap(char **,char **); main() { char *name[4]={"amol", "robin", "shanu" }; swap(&name[0],&name[2]); printf("%s %s",name[0],name[2]); } void swap(char **x,char **y) { char *temp; temp=*x; *x=*y; *y=temp; } 

这个程序运行得很完美但是当我使用function swap(char *,char *)它不会交换地址为什么? 为什么我必须使用指针指针?

我假设你理解交换整数你会有像swap(int *, int *)这样的函数

同样,当你想交换char *字符串时。 你需要像swap(char **, char **)这样的函数。

在这种情况下,你可以使用它们的指针并交换它们的内容(否则一旦函数返回就不会交换值)。 对于整数内容,指针是int * ,如果字符串内容是char *指向它的指针是char **

指针(与所有值一样)按值传递。

如果你使用swap(char * a,char * b)并写a = tmp; 这仅更改局部变量a而不更改调用者中的原始变量。

由于同样的原因,这个更简单的示例也无法正常工作:

 void change(int x) { x = 0; // Only changes the local variable. } int main(void) { int x = 0; change(x); // This does not have any effect. printf("%d", x); // 0 is printed return 0; } 

http://ideone.com/u7Prp

char *name[4]保存3个字符串文字的地址。 如果我们想要交换,我们必须传递数组的引用,其中存储了字符串文字的地址。 这意味着我们必须将name+0name+2&name[0]&name[2]传递给交换函数。

而且如果你想交换。 您必须以char **接收地址,然后我们必须更改数组中字符串文字的地址。

如果你收到它作为char *并且你试图改变像temp = x; x = y; y = temp temp = x; x = y; y = temp temp = x; x = y; y = temp ,这将是函数swap局部更改。 它不会反映在数组name

这听起来像你在寻找:

 #include void swap(char *,char *); main() { char name[4][10]={"amol", "robin", "shanu" }; swap(name[0],name[2]); printf("%s %s",name[0],name[2]); } void swap(char *x,char *y) { char *temp; temp=x; x=y; y=temp; } 

主要区别在于名称声明。 在您的版本中,您声明了一个指针数组,因此您必须将条目取消引用为* name [0]。 在第二个版本中,它声明了一个’char数组’或字符串数​​组,每个条目都包含一个字符串,而不是一个指针,因此你可以将这些条目取消引用为name [0]。 如果使用gdb并在使用print命令时单步执行代码,您将清楚地看到差异。