在C ++中透明地交换指向字符数组的指针

时间:2020-03-06 14:38:20  来源:igfitidea点击:

我有一个二维字符数组:
char nm [MAX1] [MAX2] = {" john"," bob"," david"};
我想通过简单地写交换两个元素(没有std :: swap)
swapPointers(nm [0],nm [1]);
其中swapPointers看起来像这样

void swapPointers(char *&a, char *&b)  
{  
    char *temp = a;  
    a = b;  
    b = a;  
}

但是,这不会编译(并且在添加强制转换的情况下进行编译,但指针最终指向错误/奇怪的位置)。

有人可以帮忙吗?
谢谢!

解决方案

void swapPointers(char** ppa, char** ppb)
{
    char* ptemp = *ppa;
    *ppb = *ppa;
    *ppa = ptemp;
}

swapPointers(&nm[0], &nm[1]);

我们不能通过重新分配指针来交换这些指针,因为这些指针指向二维字符数组。

nm [a]和nm [b]是非常强的" const"对象,因为nm是真正的" const"对象。如果不是这样,我们可以通过重新分配C变量的名称在RAM中移动它们。

只是想想破坏!所以你不能那样做。 :-)

要交换这些指针指向的内容,我们需要交换这些数组位置中的值。

swap(char *a, char *b)
{
  char temp[MAX1];
  memcpy(temp, a, MAX1);
  memcpy(b, a, MAX1);
  memcpy(a, temp, MAX1);
}

swapPointers()交换了指针,而我们试图传递数组。

如果你改变

char nm[MAX1][MAX2]

char *nm[MAX1]

并修复" swapPointers()"中的小错误(最后一行应为" b = temp;"),它可以正常工作。

Zan很接近,但是他的问题是他的"交换"功能可以使用任何指向字符的指针。如果使用不当,可能会导致问题。这是一个更安全的版本:

void swap(char (&x)[MAX2], char (&y)[MAX2])
{
    char temp[MAX2];

    memcpy(temp, x, MAX2);
    memcpy(x, y, MAX2);
    memcpy(y, temp, MAX2);
}

海报的一部分也有一个误解:" nm"是二维字符数组。没有指针。 nm [0],nm [2]等也都不是指针-它们仍然是(一维)数组。一维数组可以隐式转换为指针这一事实在许多C和C ++程序员中引起了这种混淆。

为了交换二维数组中的数据,必须交换大小为MAX2的内存块-正如我和Zan所写的"交换"函数所指出的那样。

真正的重点是,如果我们使用的是c ++,则应该使用std :: string的std :: vector代替:

std::vector<std::string> nm;
nm.push_back( "john" );
nm.push_back( "bob" );
nm.push_back( "david" );
std::swap( nm[0], nm[1] );

注意:未经测试。