串交换与焦效果很好**,但不与字符*(string swapping works well with

2019-09-21 15:54发布

在这个节目,我已经换了前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 *)它不换地址,为什么? 为什么我必须使用指针的指针?

Answer 1:

我想你明白,交换整数你会喜欢的功能swap(int *, int *)

同样,当你想要交换的字符串是char * 。 你会需要一个像功能swap(char **, char **)

在这种情况下,你把他们的指针和交换它们的内容(否则值将不会被一次函数返回交换)。 对于整数内容,指针int *和字符串内容情况char *指针是char **



Answer 2:

指针(像所有的值)按值传递。

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



Answer 3:

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



Answer 4:

听起来这是你在找什么:

#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和步骤。



文章来源: string swapping works well with char ** but not with char *