Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串交换可以很好地与char**配合使用,但不能与char配合使用*_C_String_Function_Pointers_Swap - Fatal编程技术网

字符串交换可以很好地与char**配合使用,但不能与char配合使用*

字符串交换可以很好地与char**配合使用,但不能与char配合使用*,c,string,function,pointers,swap,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

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

#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;
 }
#包括
无效交换(字符**,字符**);
main()
{
char*name[4]={“amol”、“robin”、“shanu”};
交换(&名称[0],&名称[2]);
printf(“%s%s”,名称[0],名称[2]);
}
无效交换(字符**x,字符**y)
{
字符*温度;
温度=*x;
*x=*y;
*y=温度;
}
这个程序运行得很好,但是当我使用
函数swap(char*,char*)
时,它不交换地址,为什么?为什么必须使用指针到指针?

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

如果使用
交换(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; 
} 

我假设您理解,要交换整数,您将使用类似于
交换(int*,int*)

类似地,当您想交换字符串时,它是
char*
。您需要类似于
swap(char**,char**)
的函数


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

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

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


如果您将其作为
char*
接收,并且如果您尝试像
temp=x这样进行更改;x=y;y=temp
,这将是对功能的本地更改
交换
。它不会反映在数组上
名称

听起来这就是您要寻找的:

#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;
 }
#包括
无效互换(字符*,字符*);
main()
{
字符名[4][10]={“amol”、“robin”、“shanu”};
掉期(名称[0],名称[2]);
printf(“%s%s”,名称[0],名称[2]);
}
无效交换(字符*x,字符*y)
{
字符*温度;
温度=x;
x=y;
y=温度;
}

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

在C中字符串是
char*
这一事实可能会增加混淆。首先尝试使用整数数组,然后是指向整数的指针数组,然后是字符串数组来实现此功能。这允许您使用问题中指定的
函数交换(char*,char*)
。此
swap()
不会交换调用方的任何内容。事实上,它没有任何实际用途。