人造人 发表于 2018-10-4 19:35:42

我们遇见过 发表于 2018-10-4 19:11
嗯。。对对,我想着应该就只出在实参和形参那。。所以就说了那么多,就是第一个可以编译,第二个不可以


r1是一个引用,引用了变量a
r2是一个const引用,引用了常量3
如果不加const会报错,因为引用的是右值,常量是右值
int main()
{
        int a = 100;
        int &r1 = a;
        const int &r2 = 3;

        return 0;
}


&qu
一个&和qu组成的表达式的值是一个右值
要引用这个右值,需要const引用
下面代码可以通过编译
#include <cstdio>
#include <cstdlib>

typedef struct Qnode
{
        int data;
        Qnode *next;
}Qnode;

typedef struct Lq
{
        Qnode *front;
        Qnode *rear;
}Lq;

void init(Lq *const &qu)
{
        /*qu = (Lq *)malloc(sizeof(Lq));
        (*qu).front = (*qu).rear = NULL;
        printf("初始化成功!\n");*/
}

int main()
{
        Lq qu;
        init(&qu);

        return 0;
}

claws0n 发表于 2018-10-4 19:37:36

我们遇见过 发表于 2018-10-4 18:33
代码一本来就是对的啊。。。代码一我理解啊,,,Lq*p=&qu,p和&qu的数据类型不一样吗。。

Lq qu; // 结构体
Lq * p; //指向结构体 Lq 的指针

int a; int *p; 这两个一样吗?从头到尾都不一样……
你的函数用 init(Lq* &qu) 相当于 init(Lq **qu),但不一样的地方在于函数内部的一些写法和传参的形式
传参 init(p) vs init(&p)   函数内部 qu vs (*qu)

我们遇见过 发表于 2018-10-4 19:40:19

人造人 发表于 2018-10-4 19:35
r1是一个引用,引用了变量a
r2是一个const引用,引用了常量3
如果不加const会报错,因为引用的是右值 ...

明白了~谢谢大佬,非常量引用的初始值必须是左值,哇塞,心情舒畅好多,感谢大佬{:10_297:}

我们遇见过 发表于 2018-10-4 19:50:09

claws0n 发表于 2018-10-4 19:37
Lq qu; // 结构体
Lq * p; //指向结构体 Lq 的指针



我理解了,就是你那个朋友说的,因为非常量引用的初始值必须是左值,而&qu是右值,如果变成常量引用的话函数体内的代码又没办法运行。谢谢大佬了,耽搁了这么长时间,万分感谢{:10_256:}

claws0n 发表于 2018-10-4 19:54:17

我们遇见过 发表于 2018-10-4 19:50
我理解了,就是你那个朋友说的,因为非常量引用的初始值必须是左值,而&qu是右值,如果变成常量引用的话 ...

4 楼就告诉你了,取址是右值……好吧,解决就好

claws0n 发表于 2018-10-4 19:57:25

人造人 发表于 2018-10-4 19:35
r1是一个引用,引用了变量a
r2是一个const引用,引用了常量3
如果不加const会报错,因为引用的是右值 ...

那样是可以编译通过,不过就废了{:10_282:}

人造人 发表于 2018-10-4 20:00:02

claws0n 发表于 2018-10-4 19:57
那样是可以编译通过,不过就废了

?

#include <cstdio>
#include <cstdlib>

typedef struct Qnode
{
        int data;
        Qnode *next;
}Qnode;

typedef struct Lq
{
        Qnode *front;
        Qnode *rear;
}Lq;

void init(Lq *const &qu)
{
        qu->front = NULL;
        qu->rear = NULL;

        /*qu = (Lq *)malloc(sizeof(Lq));
        (*qu).front = (*qu).rear = NULL;
        printf("初始化成功!\n");*/
}

int main()
{
        Lq qu;
        Lq *tmp = &qu;

        printf("front:%.8X, rear:%.8X\n", tmp->front, tmp->rear);
        init(&qu);
        printf("front:%.8X, rear:%.8X\n", tmp->front, tmp->rear);
        return 0;
}

人造人 发表于 2018-10-4 20:00:54

claws0n 发表于 2018-10-4 19:57
那样是可以编译通过,不过就废了

引用了一个指针
这个引用是const的,指针又不是

我们遇见过 发表于 2018-10-4 20:02:44

claws0n 发表于 2018-10-4 19:54
4 楼就告诉你了,取址是右值……好吧,解决就好

恩恩。。可是我当时不知道非常量引用必须是左值。。。{:10_266:},其实这是我第一次用引用- -{:10_250:}

claws0n 发表于 2018-10-4 20:09:42

人造人 发表于 2018-10-4 20:00
引用了一个指针
这个引用是const的,指针又不是

好的……有点被骗的感觉
确实,后面的元素再动态申请就好

claws0n 发表于 2018-10-4 20:11:45

我们遇见过 发表于 2018-10-4 20:02
恩恩。。可是我当时不知道非常量引用必须是左值。。。,其实这是我第一次用引用- -

没用过,第一次解释{:10_250:}
因为引用相当于被引用的变量,所以左值也考虑了

我们遇见过 发表于 2018-10-4 20:36:59

claws0n 发表于 2018-10-4 20:11
没用过,第一次解释
因为引用相当于被引用的变量,所以左值也考虑了

哈哈哈,这玩意还挺好玩{:10_250:}
页: 1 2 [3]
查看完整版本: 链式队列的一个问题,为什么第一种可以运行,第二种没有报错但是运行会中断