传递对char指针的引用会导致错误

时间:2013-11-01 20:04:36

标签: c++ pointers

我想传递一个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 ++的新手,我认为我正确地阅读了关于指针和参考的教程。

EXTRA:我试过用不同的编译器,Turbo 16,我认为,并且它抛出了其他十个错误,所以我不知道它是否是编译器问题。

4 个答案:

答案 0 :(得分:0)

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

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

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

现在,只要使用b类型的变量,就可以使用char但是,您的函数需要char *作为其第二个参数。

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

此外,您的定义和声明也不匹配。

答案 1 :(得分:0)

你的代码有很多问题。

引用和指针在C ++语言中并不相同,尽管它们在编译的机器代码中以相同的方式实现。您不能传递指针所在的引用,反之亦然。您正试图传递short*,其中short&是预期的,而char&则需要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!";
}

答案 2 :(得分:0)

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

void clear(char *p) { *p = '\0'; }

char c = 'a';
clear(&c);     // after this call c == '\0'

你真的在寻找更先进的东西吗?

参考变量:

char &r = c;

实际上非常复杂。 (并且仍会传递&r

答案 3 :(得分:0)

有许多事情困扰我的代码所以我会经历一些它们。

1:您的原型不匹配。

更改

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

void change_sugar(const short& 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, &lala);

<强>最后:

您的代码非常容易阅读并弄清楚您实际想要做什么。我建议您退一步思考您想要实现的目标并重新设计代码。