2

我有

const char* one = "q";
const char* two = "p";

如果我添加代码

const char* temp = two;
two = one;
one = temp;

我可以切换“一”和“二”的内容,但是用

void order(const char* first, const char* second)
    {
    const char* temp = second;
    second = first;
    first =  temp; 
    }

order(one, two);

我无法切换它们。我猜这是因为我将错误的参数传递给我的函数?

4

5 回答 5

4

编辑:是的 - 这些是指向 const char 的指针......所以指针本身不是 const。

您正在尝试更改指针指向的内容 - 该函数获取原始指针内容的副本,因此您需要拥有指针指针或使用引用。

IE:

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)
{}

(内容和你的功能一样)

于 2013-08-08T19:22:49.697 回答
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 的引用,这两个词都没有在编程上下文中使用,或者指的是通常map在 C++ 中调用的内容。

于 2013-08-08T19:34:38.603 回答
2

first您的代码仅传递和second订购的副本。要更改firstand 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 *不是交换数组的内容,而不是交换指向它们的指针,前提是每个数组都足够大以包含另一个数组中的字符串。

于 2013-08-08T19:35:23.377 回答
0

您正在按值传递指针,并期望在该函数内更改这些指针的值。类似于按值传递任何变量。正如其他人指出的那样,通过引用传递它们。

于 2013-08-08T19:38:33.013 回答
-1

您的函数获取指针的本地副本。本地副本实际上是切换的,但不会反映在调用函数中,因为它们的范围在 order() 函数内结束。

您可以使用 strcpy() 函数将字符串复制到临时 char 数组,然后交换它们。

于 2013-08-08T19:28:29.477 回答