在这个节目,我已经换了前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 *)
它不换地址,为什么? 为什么我必须使用指针的指针?
我想你明白,交换整数你会喜欢的功能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+0
和name+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<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;
}
主要的区别是名称的声明。 在你的版本你,所以你必须声明指针数组取消引用条目为*名称[0]。 在第二个版本,它声明“字符阵列”或串的阵列,并且每个条目保存的字符串,而不是一个指针,因此可以解除引用的条目作为名称[0]。 你会清楚地看到区别,如果您在使用打印命令通过代码使用GDB和步骤。