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

时间:2008-09-24 02:34:16

标签: c++ pointers

我有一个2D角色阵列:
char nm[MAX1][MAX2] = { "john", "bob", "david" };
我想通过简单地写下来交换其中两个元素(没有std::swapswapPointers(nm[0], nm[1]);
其中swapPointers看起来像这样

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

然而,这不会编译(并且在添加强制转换使其编译时,指针最终指向错误/奇怪的位置)。

有人可以帮忙吗? 谢谢!

5 个答案:

答案 0 :(得分:4)

Zan很接近,但他的问题是他的'swap'函数可以接受任何指向字符的指针。如果误用,可能会导致问题。这是一个更安全的版本:

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]等......也不是指针 - 它们仍然是(1维)数组。事实上,一维数组可以隐式转换为指针,这导致许多C和C ++程序员之间的混淆。

为了交换二维数组中的数据,你必须交换大小为MAX2的内存块 - 正如Zan和我写的“交换”函数所示。

答案 1 :(得分:3)

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

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

想想破坏!所以你不能这样做。 : - )

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

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

答案 2 :(得分:3)

你的swapPointers()交换指针,而你正试图传递数组。

如果你改变了

char nm[MAX1][MAX2]

char *nm[MAX1]

并修复swapPointers()中的小错误(最后一行应为b = temp;),它有效。

答案 3 :(得分:1)

真正的问题是,如果你使用的是c ++,那么你应该使用std :: vector的std :: string代替:

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

注意:未经测试。

答案 4 :(得分:0)

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

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