doubidoubidou 2022-09-12 12:13 采纳率: 100%
浏览 28
已结题

c语言里*和&的使用

typedef struct
{
char vex[20];
int arcs[20][20];
int vexnum, arcnum;
}MGraph,*mgraph;

本人最近在学习图,在创建图的时候,用的函数是的参数是*&类,结果运行输入顶点和弧的时候就卡死停止了,主函数是
void Create_MG(mgraph &MG){}
int main()
{
mgraph MG;
Create_MG(MG);
return 0;
}

改回网上代码里的*类,主函数改一下就正常了
void Create_MG(MGraph *MG){}
int main()
{
MGraph MG;
Create_MG(&MG);
return 0;
}

想请问一下各位,什么时候用*和&啊
1.我看前面链表和树,都是在定义的时候额外添加一个指针类的,后面定义函数和主函数的时候,就都是用指针类的变量
2.&在链表和树里面,都能直接在定义函数的时候使用,为什么这里只能在主函数使用
3.getchar()的使用,我是看了一下网上代码后自己按着记忆写的,结果因为漏了这2个getchar(),输入顶点的时候就直接循环2次

img

printf("输入顶点数:");
scanf_s("%d", &MG->vexnum);
printf("输入弧数:");
scanf("%d", &MG->arcnum);
getchar();
for (int i = 1; i <= MG->vexnum; i++)
{
    printf("请输入第%d个顶点:", i);
    scanf("%c", &MG->vex[i]);
    getchar();
}
  • 写回答

3条回答 默认 最新

  • yun6853992 2022-09-12 12:33
    关注

    这里涉及到的知识点就比较多,我能想到的简单整理一下就是:
    1:指针和地址的概念,需要你去梳理一下, 指针实际指向的是一个地址
    2:指针相关的符号就是用* 声明指针变量的时候 类型后面加 是代表指针类型 可以给该指针变量赋值一个地址 代表指针只想这个地址。
    而这个指针变量,取指针变量指向的内存中的值,就可以再指针变量前面加个
    这时 *就不是声明变量了,而是取地址中的值的含义了
    3:& 取地址符号可以是对象取地址时用, C++ 后面一个引用的概念 其实也与这个符号相关

    所以 这里你需要理解一下指针,地址的概念,需要了解*在不同含义下所起到的含义,以及&在不同场景下代表的含义。

    接下来就是你的问题:
    1:有一种场景,比如链表,需要在本对象中存储下一个对象的地址,所以用了指针。 而取地址,一般就取一个对象的地址,比如赋值给这个指针。
    2:& 在哪里都可以用啊 看你的场景啊 看你的样例 Create_MG(&MG); 这里用&符号是因为 void Create_MG(MGraph *MG){} 这里函数定义时 参数是指针类型
    指针类型可以用&对象做初始化 比如 int a =0; int *b = &a; 取a的地址赋值给指针b,所以可以用
    至于你的失败 是因为你声明函数时 如果这样 void Create_MG(mgraph &MG){} 这其实应该成引用了 引用的概念了解一下,函数传参就不一样了 ,要用Create_MG(MG); 直接传对象 而不是对象的地址
    3: 这个问题 知识点应该时scanf格式化相关的问题 getchar只是适应了你的场景 输入一个字符让继续运行用的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月20日
  • 已采纳回答 9月12日
  • 创建了问题 9月12日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题