2

我有一个 2D 字符数组:我想通过简单地写 where
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;  
}

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

有人可以帮忙吗?
谢谢!

4

5 回答 5

4

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 编写的“交换”函数所示。

于 2008-09-24T04:44:46.623 回答
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);
}
于 2008-09-24T03:02:47.820 回答
3

您的swapPointers()交换指针,而您正在尝试将其传递给数组。

如果你改变

char nm[MAX1][MAX2]

char *nm[MAX1]

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

于 2008-09-24T03:25:47.127 回答
1

真正的重点是,如果您使用的是 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] );

注意:未测试。

于 2008-09-24T05:25:43.547 回答
0
void swapPointers(char** ppa, char** ppb)
{
    char* ptemp = *ppa;
    *ppb = *ppa;
    *ppa = ptemp;
}

swapPointers(&nm[0], &nm[1]);
于 2008-09-24T02:37:52.140 回答