我不确定您要做什么,但我猜您正在尝试交换向量中的两个值。正如您的评论所说,使用交换会起作用,但我认为您对代码的实际作用感到困惑。让我们一步一步来:
vector<int> test(4);
test[0] = 5;
test[1] = 4;
test[2] = 3;
test[3] = 2;
swap_spec(*test[0], *test[1]); // *test[0] is the same as *(test[0])
当您执行 *test[0] 时,这与 *(test[0]) 相同。这意味着取消引用/查看内存地址 test[0] 中的值,即 5。您无法访问该内存地址,因此会导致段错误。
第二个问题:
void swap_spec(vector<int>* a, vector<int>* b)
{
vector<int>* tmp = NULL;
*tmp = *a;
*a = *b; // This says, get whatever vector is pointed at b, and copy it to the memory location variable a points to.
*b = *tmp;
}
由于您正在传递指向向量的指针,因此您在这里所说的是交换两个向量,而不是它们内部的值。但是当你用以下方式调用它时:
swap_spec(*test[0], *test[1]);
test[0] 的类型是 int,*(test[0]) 的类型是取消引用的 int(这是一个段错误,但应该是另一个 int 类型),但参数类型是向量 *(a指向向量的指针),这已经与您传入的参数不一致。看看这在多个级别上已经是错误的。
因此,鉴于所有这些信息,您似乎正在尝试交换向量中的两个值。您可以通过以下两种方式之一执行此操作。您可以使用指针执行此操作:
void swap_spec(int *a, int *b) {
int tmp = *a;
*a = *b; // Go to address location where variable a points to, and assign whatever value is at memory location where variable b points to
*b = tmp;
}
swap_spec(&test[0], &test[1]); // Pass in address of where test[0] and test[1] points to
// Note that type of &test[0] is an int * (Consistent with parameter)
或参考:
void swap_spec(int &a, int &b) {
int tmp = a;
a = b; // Since you are using references, this will actually modify test[0] at its memory location
b = tmp;
}
swap_spec(test[0], test[1]); // Since you are using references, you don't need to pass in the address.
第二种方式与标准库的swap相同(http://www.cplusplus.com/reference/algorithm/swap/)。引用有时(或可能普遍)受到青睐,因为它产生更清晰的代码(使用较少的 * 运算符)并因此减少混乱。