我需要创建一个交换函数,接受2个地址作为输入,并交换它们,无论它们指向什么类型.下面是我的交换函数:

void swap(void* x,void* y){
  void* temp=x;
  x=y;
  y=temp;
}

当我对整数使用它时,它工作得很好,并且正确地交换了它们,但使用字符串时,地址似乎在函数内部交换了,但当我试图从函数外部调用它们时,我注意到它们根本没有改变.

以下是我的完整代码和结果输出.

  printf("before %s %s\n",(char*)array[i],(char*)array[j] );
  swap(array[i], array[j]);
  printf("after %s %s\n",(char*)array[i],(char*)array[j] );

我想尽一切办法来了解他们到底出了什么问题.

void swap(void* x,void* y){
  printf("  after IN %s %s\n",(char*)x,(char*)y );
  void* temp=x;
  x=y;
  y=temp;
  printf("  after IN %s %s\n",(char*)x,(char*)y );
}

输出量

before fannullone falafel
  after IN fannullone falafel
  after IN falafel fannullone
after fannullone falafel

推荐答案

要交换函数中的两个对象,需要通过引用将它们传递给函数.

在C中,通过引用传递意味着通过指向对象的指针间接传递对象.因此,取消对指针的引用后,该函数可以直接访问原始对象,并可以更改它们.

因此,对于类型void *的对象,函数参数将具有类型void **.该函数将如下所示

void swap( void **x, void **y )
{
    void *temp = *x;
    *x = *y;
    *y = temp;
}

这是一个演示程序.

#include <stdio.h>

void swap( void **x, void **y )
{
    void *temp = *x;
    *x = *y;
    *y = temp;
}

int main( void ) 
{
    void *s1 = "Hello";
    void *s2 = "World";

    printf( "s1 = %s, s2 = %s\n", ( char * )s1, ( char * )s2 );

    swap( &s1, &s2 );

    printf( "s1 = %s, s2 = %s\n", ( char * )s1, ( char * )s2 );
}

程序输出为

s1 = Hello, s2 = World
s1 = World, s2 = Hello

C++相关问答推荐

C strlen on char array

数据包未从DPDK端口传输到内核端口

GCC预处理宏和#杂注GCC展开

变量>;-1如何在C中准确求值?

为什么该函数不将参数值保存到数据 struct 中?

使用scanf在C中读取和存储文件中的值

如何将字符**传递给需要常量字符指针的常量数组的函数

加密解密工作正常,但返回错误0x80090005

静态初始化顺序失败是否适用于C语言?

如何逐位读取二进制文件?

Fscanf打印除退出C代码为1的程序外的所有内容

当用C打印过多的';\n';时输出不正确

在下面的C程序中,.Ap0是如何解释的?

生成的头文件不包括用户定义的文件

RISC-V GCC编译器错误编译ASM代码

为什么这个代码的最后一次迭代不能正常工作?

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

使用fread()函数读取txt文件

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组

如何确保 gcc + libc 对于多字节字符串使用 UTF-8,对于 wchar_t 使用 UTF-32?