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

时间:2012-08-25 08:39:16

标签: c string function pointers swap

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

#include<stdio.h>
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 *)时它不会交换地址为什么?为什么我必须使用指针指针?

4 个答案:

答案 0 :(得分:6)

我假设你明白要交换整数,你会有像swap(int *, int *)

这样的函数

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

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

答案 1 :(得分:4)

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

如果您使用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

答案 2 :(得分:0)

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

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

如果您将其作为char *收到,并且如果您尝试更改为temp = x; x = y; y = temp,则会对函数swap进行本地更改。它不会反映在数组name上。

答案 3 :(得分:-1)

听起来这就是你要找的东西:

#include<stdio.h>
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命令时逐步执行代码,您将清楚地看到差异。