鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: 我们遇见过

[已解决]链式队列的一个问题,为什么第一种可以运行,第二种没有报错但是运行会中断

[复制链接]
发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

明白了~谢谢大佬,非常量引用的初始值必须是左值,哇塞,心情舒畅好多,感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-4 19:50:09 | 显示全部楼层
claws0n 发表于 2018-10-4 19:37
Lq qu; // 结构体
Lq * p; //指向结构体 Lq 的指针

我理解了,就是你那个朋友说的,因为非常量引用的初始值必须是左值,而&qu是右值,如果变成常量引用的话函数体内的代码又没办法运行。谢谢大佬了,耽搁了这么长时间,万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

4 楼就告诉你了,取址是右值……好吧,解决就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那样是可以编译通过,不过就废了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-4 20:00:54 | 显示全部楼层
claws0n 发表于 2018-10-4 19:57
那样是可以编译通过,不过就废了

引用了一个指针
这个引用是const的,指针又不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-4 20:02:44 | 显示全部楼层
claws0n 发表于 2018-10-4 19:54
4 楼就告诉你了,取址是右值……好吧,解决就好

恩恩。。可是我当时不知道非常量引用必须是左值。。。,其实这是我第一次用引用- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-4 20:09:42 | 显示全部楼层
人造人 发表于 2018-10-4 20:00
引用了一个指针
这个引用是const的,指针又不是

好的……有点被骗的感觉
确实,后面的元素再动态申请就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没用过,第一次解释
因为引用相当于被引用的变量,所以左值也考虑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-4 20:36:59 From FishC Mobile | 显示全部楼层
claws0n 发表于 2018-10-4 20:11
没用过,第一次解释
因为引用相当于被引用的变量,所以左值也考虑了

哈哈哈,这玩意还挺好玩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 19:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表