【问题标题】:string swapping works well with char ** but not with char *字符串交换适用于 char ** 但不适用于 char *
【发布时间】:2012-08-20 16:08:32
【问题描述】:

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

#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 *) 时它没有交换地址,为什么?为什么我必须使用指向指针的指针?

【问题讨论】:

  • 字符串在 C 中是 char* 的事实可能会增加混淆。尝试先用一个整数数组来实现它,然后是一个指向整数的指针数组,然后是一个字符串数组。

标签: c string function pointers swap


【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      如果您以char * 接收它,并且如果您尝试像temp = x; x = y; y = temp 一样进行更改,那么这将是函数swap 的本地更改。它不会反映在数组name

      【讨论】:

        【解决方案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;
         }
        

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

        【讨论】:

        • 这使您可以使用问题中指定的function swap(char *,char *)
        • 这个swap() 不会在调用方交换任何东西。事实上它是 NOOP,没有实际用途。
        猜你喜欢
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        • 2017-01-06
        • 2022-12-11
        相关资源
        最近更新 更多