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次
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();
}
这里涉及到的知识点就比较多,我能想到的简单整理一下就是:
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只是适应了你的场景 输入一个字符让继续运行用的
供参考:https://zhidao.baidu.com/question/1052242225076050179.html