将指针作为函数参数传递

时间:2013-08-08 19:20:16

标签: c++

我有

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);

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

5 个答案:

答案 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)

您的代码只会将firstsecond的副本传递给订单。要更改firstsecond,您必须传递引用或指针。供参考:

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数组,然后交换它们。