【问题标题】:Swap pointers on C or C++ [duplicate]在 C 或 C++ 上交换指针 [重复]
【发布时间】:2021-03-20 05:52:32
【问题描述】:

为什么第一个选项不起作用? “pointer->malloc”和“type []”是动态预留内存的一部分,有区别吗?

int a[10];
int b[10];
int *aux;
aux=a;
a=b;
b=aux;
int *a=(int*)malloc(10);
int *b=(int*)malloc(10);
int *aux;
aux=a;
a=b;
b=aux;

【问题讨论】:

  • 第一个选项不起作用,因为ab 不是指针,它们有时只是衰减到它们。您不能为这样的数组分配新地址。
  • ab 不是指针,它们是数组。数组不是指针,它们是数组。数组和数组和指针都是指针。数组可以转换为指针,但这并不意味着它们本身就是指针(因此不能像它们一样交换/处理)
  • a=b 在第一种情况下不能在 C++ 中编译。
  • 但我做不到 a=&b[0] 没错,你不能这样做。
  • 很多程序员都犯了这个错误,因为他们接受的教育把事情搞混了,告诉他们数组是指针。然后他们毕业,找到工作,发现他们学到的任何特定语言的一半以上是错误的,即使不是非常有趣和危险的错误。

标签: c++ c pointers swap


【解决方案1】:

在这段代码中:

int a[10];
int b[10];
int *aux;
aux=a;
a=b;
b=aux;

aux=a; 语句有效,因为a 衰减 成为指向其第一个元素的指针。所以这实际上与aux=&a[0]; 相同

a=b; 语句不起作用,因为ab 都是数组,而数组根本不能以这种方式复制。你正在尝试做&a[0]=&b[0];,这根本行不通。您不能重新分配变量在内存中的地址。

如果您改用std::array,那么a=b; 语句将起作用,因为std::array 实现了operator=,它只是将每个元素从一个数组复制到另一个数组。但是如果你没有使用std::array,那么你必须手动复制元素,使用memcpy()或者更好的std::copy()

语句b=aux; 不起作用,因为b 是一个数组,而aux 是一个指针,您不能将指针分配给数组。

对于您尝试做的事情,您必须将aux 更改为一个数组,并且实际上将元素从一个数组复制到另一个数组,例如:

#include <algorithm>

int a[10];
int b[10];
int aux[10];
std::copy(a, a+10, aux);
std::copy(b, b+10, a);
std::copy(aux, aux+10, b);

或者,使用std::array,它可以为您复制:

#include <array>

std::array<int, 10> a;
std::array<int, 10> b;
std::array<int, 10> aux;
aux = a;
a = b;
b = aux;

而在其他代码中:

int *a=(int*)malloc(10);
int *b=(int*)malloc(10);
int *aux;
aux=a;
a=b;
b=aux;

您只是在交换相同类型的指针 (int*),它们实际上指向什么并不重要,您没有触及该数据。顺便说一句,(int*)malloc(10) 对于 int 数组是错误的,它需要改为 (int*)malloc(sizeof(int)*10)

【讨论】:

  • 但我不想复制,如果它们有指针并且可能的话,我想交换它们的指针。
  • 数组不是指针,所以你不能把它们当作单纯的指针交换,你只能交换它们的元素数据。
  • 是的,我说“如果”,因为也许有办法做到这一点,我不知道。因为我在这个页面上读了 10 次“数组不是指针”并且理解了它,但是我知道要访问数据你需要内存地址,所以那个数组是指一个内存地址,我可以知道,我想要的是改变它
  • @mouadnaciri 没有办法用数组做你想做的事。要么将单个元素值从一个数组移动到另一个数组,要么交换指向数组的指针,但不能交换数组本身。它只是不那样工作。你不能改变变量的内存地址
  • "array 指的是一个内存地址" @mouadnaciri 听起来你仍然有点混淆数组和指针。数组一个内存地址,但它不引用一个。我认为,如果您尝试“交换”指向数组的指针,您可能想要做的是创建 2 个指向数组中元素的指针并交换它们。这不会交换数组本身,只是指针所指的。喜欢int* pa = a, pb = b; 然后交换papb
猜你喜欢
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多