我有
const char* one = "q";
const char* two = "p";
如果我添加代码
const char* temp = two;
two = one;
one = temp;
我可以切换'one'和'two'的内容,但是
void order(const char* first, const char* second)
{
const char* temp = second;
second = first;
first = temp;
}
order(one, two);
我无法切换它们。我猜这是因为我将错误的参数传递给我的函数?
答案 0 :(得分:4)
编辑:true - 这些是指向const char的指针......所以指针本身不是const。
您正在尝试更改指针指向的内容 - 该函数获取原始指针的副本的副本,因此您需要具有指针指针或使用引用。
即:
C
void order( const char **first, const char **second )
{
const char* temp = *first;
*first = *second;
*second = temp;
}
C ++
void order( const char *&first, const char *&second)
{}
(内容与您的功能相同)
答案 1 :(得分:3)
简单的解决方案是
#include <algorithm>
然后只需std::swap
两个指针,即std::swap(first, second)
。
更难解决的问题是编写自己的swap
,并将其称为order
。
void order(const char*& first, const char*& second) {
const char* temp = second;
second = first;
first = temp;
}
请注意在参数中使用&
。这意味着参数通过引用传递 ,这意味着对指针的修改将反映在对传入参数的修改中。
引用是一种C ++特性,它允许您将变量作为其他变量的别名。
您的问题是您混淆了区域(指向的数据)的地图(指针),然后认为指针上的=
修改了数据。相反,你制作了地图(指针)的副本,在你的函数中绘制了它们,然后丢弃你离开子程序后制作的副本。
因为所有更改(交换)都在指针的副本(重复的地图)上,原始指针(地图)就在那里。
我使用“map”和“territory”作为对Alfred Korzybski的引用,这些单词都没有在编程上下文中使用,或者在C ++中引用通常称为map
的内容。
答案 2 :(得分:2)
您的代码只会将first
和second
的副本传递给订单。要更改first
和second
,您必须传递引用或指针。供参考:
void order(const char *&first, const char *&second)
{
const char *temp = second;
second = first;
first = temp;
}
指点:
void order(const char **first, const char **second)
{
const char *temp = *second;
*second = *first;
*first = temp;
}
还有std::swap
,包含<algorithm>
:
std::swap(first, second);
此外,如果字符串是常规数组而不是字符串文字,您可以将它们作为char *
而不是const char *
传递,并交换数组的内容而不是交换指向它们的指针,前提是每个数组足够大,可以在另一个中包含字符串。
答案 3 :(得分:0)
您按值传递指针并期望在该函数内更改这些指针的值。类似于按值传递任何变量。如他人所指出的那样通过引用传递它们。
答案 4 :(得分:-1)
您的函数获取指针的本地副本。本地副本实际上已切换,但未在调用函数中反映,因为它们的作用域在order()函数内结束。
您可以使用strcpy()函数将字符串复制到临时char数组,然后交换它们。