14

我有两个需要交换的指针数组。与其仅仅复制数组中的数据,不如交换指向数组的指针更有效。我一直认为数组名称本质上只是指针,但以下代码收到编译器错误:

double left[] = {1,2,3};
double right[] = {9,8,7};

double * swap = left;
left = right; // Error "ISO C++ forbids assignment of arrays"
right = swap; // Error "incompatible types in assignment of `double*' to `double[((unsigned int)((int)numParameters))]'"

动态创建数组可以解决问题,但不能在我的应用程序中完成。我该如何进行这项工作?

4

7 回答 7

14
double array_one[] = {1,2,3};
double array_two[] = {9,8,7};

double *left = array_one;
double *right = array_two;

double * swap = left;
left = right;
right = swap;

效果很好。

编辑: 不应该使用定义 array_one 和 array_two 并且双左和双右应该像你原来的左和右定义一样公开。

于 2010-08-03T04:14:33.527 回答
13

数组与指针不同,不能按照您描述的方式进行交换。要进行指针交换技巧,您必须使用指针,要么动态分配内存,要么使用指针访问数据(如 Daniel 所描述的那样)。

于 2010-08-03T05:06:18.490 回答
5

C 风格的数组不是指针,但像大多数对象一样,它们可以与标准交换std::swap()

#include <iostream>
#include <utility>
int main()
{
        double array_one[] = {1,2,3};
        double array_two[] = {9,8,7};
        std::swap(array_one, array_two);
        std::cout << "array_one[0] = " << array_one[0] << '\n';
        std::cout << "array_two[0] = " << array_two[0] << '\n';
}

实际上,数组的 std::swap() 看起来只在 C++0x (20.3.2) 中定义,所以没关系。正确的答案是,对于范围内的数组和作为指向第一个元素的指针的数组:

 std::swap_ranges(array_one, array_one + 3, array_two);
于 2010-08-03T04:47:10.817 回答
2

让人们相信它们不是指针并且不容易交换的最简单方法之一是显示以下代码:

struct ex {
  char c[4];
  double d[3];
};
struct ex a = {"foo", {1.0, 2.0, 3.0} };
struct ex b = {"bar", {6,7,8} };

现在清楚地a.db.d数组。交换它们将涉及艰苦的工作,因为数组 {6,7,8} 必须在内存中结束a.c=="foo",这意味着复制 3 个双精度数。图中没有指针。

于 2010-08-03T14:48:55.583 回答
0

您可以通过引用将两个指针传递给数组,如果指针不是 const,则可以交换它们:

void swap(char * & first, char * & second)
{
     std::swap(first, second);
}
于 2010-08-03T14:23:24.503 回答
0

尝试这个

double *right = (double[]){9,8,7};
double *left = (double[]){8,2,3};   
于 2010-08-03T04:13:08.000 回答
-2

声明数组时,名称是指针,不能更改。

前任:

int array[10];
int *p;

p = array; // legal
array = p; // illegal; array is a constant pointer which can't be altered.

实现交换的唯一方法是使用指向数组的新指针。

这应该可以帮助您:

SO关于数组名称作为指针的问题

于 2010-08-03T04:52:05.133 回答