【问题标题】:Passing reference to char pointer is resulting in an error传递对 char 指针的引用会导致错误
【发布时间】:2013-11-01 20:04:35
【问题描述】:

我正在尝试将 char & 值传递给函数中的 char * 参数,但它不起作用,如下所示:

#include <iostream>
using namespace std;

void change_sugar(const short& sugars, char* LOC);

int main()
{
    static int caga = 0;
    const short* mysweets;
    char& lala;
    change_sugar(mysweets, lala);
}
void change_sugar(const short& sugars, char** LOC[])
{
    if (sugars == 3000)
        LOC[1] = 5;
    cout << "Sugar is not nCaga, nor caga" << " ___  !@S ";
    cerr << "nCaga failed!";
}

错误输出:

错误:'lala' 声明为引用但未初始化

我正在尝试将引用传递给相同类型的指针。它是否正确?

请耐心等待,我是 C++ 新手,我认为我正确阅读了有关指针和引用的教程。

额外:我认为我使用不同的编译器 Turbo 16 进行了尝试,但它抛出了其他十个错误,所以我不知道这是否是编译器问题。

【问题讨论】:

  • 我意识到传递引用是没有用的,但我只是想练习正确获取指针和引用,所以我一直在“玩弄”这些东西,直到我使用它为止。
  • 您的第一个问题不应该是“为什么需要初始化引用变量”吗?
  • 引用必须在创建区域时绑定(初始化);创建引用后无法更改绑定。您的编译器正确地抱怨。并且char &amp; 不可能合法地传递给期望char **[] 的函数。在最好的情况下,这是一个令人讨厌的函数参数——查看三星级程序员了解原因。
  • change_sugar() 的定义与前面的声明冲突。你声明它取char *LOC,但定义说char **LOC[],相当于char ***LOC。我很惊讶你没有收到关于这方面的错误。
  • 它需要一个 char *,而不是三重指针!

标签: c++ pointers


【解决方案1】:

在 C++ 中,引用必须始终有效(而不是“悬空”),因此您必须在创建它时对其进行初始化。

我不确定你想用你的lala 做什么,但是引用变量的正确用法是这样的:

char a;
char & b = a; // has to be initialized here

现在您可以在要使用char 类型的变量的任何地方使用b然而,你的函数需要char *作为它的第二个参数。

因此,在初始化引用之后,您仍然可以使用它的地址使其适合:&amp;lala

你的定义和声明也不匹配。

【讨论】:

  • 嗯?我不明白为什么我要把lala的地址指向mysweets?问题是将 lala 传递给第二个参数。
【解决方案2】:

您的代码有很多问题。

引用和指针在 C++ 语言中不是一回事,尽管它们在编译的机器代码中以相同的方式实现。您不能在需要指针的地方传递引用,反之亦然。您正在尝试传递 short* 应为 short&amp; 的位置,以及 char&amp; 应为 char* 的位置。

引用永远不会被初始化(因此编译器错误),但指针可以被初始化。

change_sugar() 声明中的参数与定义中的参数不匹配。在 C++ 中,它们必须匹配。

目前还不清楚change_sugar() 到底想做什么。显然,您想要更改传入的 char,但 char 的大小只有 1 个字节,而您正试图更改被更改数据的 1 字节边界之外的内存。

试试这个:

#include <iostream>
using namespace std;

void change_sugar(const short& sugars, char* LOC);

int main()
{
    short mysweets = 3000;
    char lala = 0;
    change_sugar(mysweets, &lala);
}

void change_sugar(const short& sugars, char* LOC)
{
    if ((LOC) && (sugars == 3000))
        *LOC = 5;
    cout << "Sugar is not nCaga, nor caga" << " ___  !@S ";
    cerr << "nCaga failed!";
}

或者这个:

#include <iostream>
using namespace std;

void change_sugar(const short& sugars, char& LOC);

int main()
{
    short mysweets = 3000;
    char lala = 0;
    change_sugar(mysweets, lala);
}

void change_sugar(const short& sugars, char& LOC)
{
    if (sugars == 3000)
        LOC = 5;
    cout << "Sugar is not nCaga, nor caga" << " ___  !@S ";
    cerr << "nCaga failed!";
}

【讨论】:

    【解决方案3】:

    有一个非常简单的范例可以将变量传递给需要指针的方法:

    void clear(char *p) { *p = '\0'; }
    
    char c = 'a';
    clear(&c);     // after this call c == '\0'
    

    你真的在这里寻找更高级的东西吗?

    参考变量:

    char &r = c;
    

    其实很复杂。 (并且仍然会通过&amp;r

    【讨论】:

      【解决方案4】:

      代码有很多让我困扰的地方,所以我将逐一介绍。

      1:您的原型不匹配。

      改变

      void change_sugar(const short&amp; sugars, char** LOC[])

      void change_sugar(const short&amp; sugars, char* LOC)

      或其他方式取决于您实际想要做什么。

      2。您的指针未初始化。

      const short* mysweets 未初始化。为它分配一些内存。

      const short* mysweets = malloc(sizeof(short));

      然后

      *mysweets = 3000;

      3. lala 不是指针。

      如果你想将lala 的地址传递给你的函数change_sugar,那么初始化它

      char* lala = malloc(sizeof(char));

      并将其传递为

      change_sugar(mysweets, lala);

      如果你不希望它是一个指针但仍想通过引用传递,那么声明它

      char lala;

      并将其传递为

      change_sugar(mysweets, &amp;lala);

      最后:

      您的代码阅读起来非常混乱,难以弄清楚您真正想要做什么。我建议退后一步,想想你想要实现什么并重新设计你的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2018-10-19
        • 2020-12-17
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多