4

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

#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

4 回答 4

6

我假设您了解要交换整数,您将具有类似的功能swap(int *, int *)

同样,当您要交换字符串时,即char *. 你需要像swap(char **, char **).

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

于 2012-08-25T08:48:52.750 回答
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

于 2012-08-25T08:41:51.970 回答
0

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

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

如果您收到它char *并且如果您尝试更改temp = x; x = y; y = temp,那将是对功能的本地更改swap。它不会反映在阵列上name

于 2012-08-25T08:54:37.280 回答
-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 命令时单步执行代码,您将清楚地看到差异。

于 2012-08-25T09:01:05.127 回答