最近有人问我LNode* L和LNode* &L的区别
很简单 这种区别很微小 要联系到具体运用上
废话不说 上代码
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*Linklist;
int pr(Linklist &L);
int main() {
LNode* L=NULL;
printf("传入前指针存储地址%p\n",L);
pr(L);//传入指针存储的地址
printf("传入后指针存贮地址%p\n",L);
}
int pr(LNode* &L){
L=(LNode*)malloc(sizeof(LNode));
L->data=10;
printf("函数内分配内存后----指针存储地址%p\n",L);
printf("%d\n",L->data);
return 0;
}
加了&符号 函数操作后 函数内指针L存储的地址变化 会自动更新到主函数的L身上
所以一般加&符号是为了生成无头结点链表
或者 初始化链表;
再来看看不加&符号的代码
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*Linklist;
int pr(Linklist L);
int main() {
LNode* L=NULL;
printf("传入前指针存储地址%p\n",L);
pr(L);//传入指针存储的地址
printf("传入后指针存贮地址%p\n",L);
}
int pr(LNode* L){
L=(LNode*)malloc(sizeof(LNode));
L->data=10;
printf("函数内分配内存后----指针存储地址%p\n",L);
printf("该结构体值%d\n",L->data);
return 0;
}
很显然 LNode 无法做到自动更新 这个时候主函数的地址依旧我行我素
有人问我要是这种情况怎么解决 相当简单 除了加&外 就是将函数修改成这样
没错就是再赋一遍值 简单粗暴 人类的脑瓜永远为简单粗暴而生
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*Linklist;
LNode* pr(Linklist L);
int main() {
LNode* L=NULL;
printf("传入前指针存储地址%p\n",L);
L=pr(L);//传入指针存储的地址
printf("传入后指针存贮地址%p\n",L);
}
LNode* pr(LNode* L){
L=(LNode*)malloc(sizeof(LNode));
L->data=10;
printf("函数内分配内存后----指针存储地址%p\n",L);
printf("该结构体值%d\n",L->data);
return L;
}