代码之家  ›  专栏  ›  技术社区  ›  Cameron

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

  •  2
  • Cameron  · 技术社区  · 17 年前

    我有一个二维字符数组:
    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;  
    }
    

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

    有人能帮忙吗?
    谢谢!

    5 回复  |  直到 15 年前
        1
  •  4
  •   Kevin    17 年前

    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]等也不是指针——它们仍然是(一维)数组。一维数组可以隐式转换为指针的事实在许多C和C++程序员中造成了这种混淆。

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

        2
  •  3
  •   Zan Lynx    17 年前

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

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

    想想这场浩劫!所以你不能这么做。 :-)

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

    swap(char *a, char *b)
    {
      char temp[MAX1];
      memcpy(temp, a, MAX1);
      memcpy(b, a, MAX1);
      memcpy(a, temp, MAX1);
    }
    
        3
  •  3
  •   Hugh Allen    17 年前

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

    如果你改变

    char nm[MAX1][MAX2]
    

    char *nm[MAX1]
    

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

        4
  •  1
  •   graham.reeds    17 年前

    真正的问题是,如果你使用的是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] );
    

    注:未测试。

        5
  •  0
  •   Ana Betts    17 年前
    void swapPointers(char** ppa, char** ppb)
    {
        char* ptemp = *ppa;
        *ppb = *ppa;
        *ppa = ptemp;
    }
    
    swapPointers(&nm[0], &nm[1]);