C语言中关于指针变量的坑

 更新时间:2021年04月06日 10:09:16   作者:猿DUDU  
这篇文章主要给大家介绍了关于C语言中关于指针变量坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

先看一个初始化带头结点单链表的例子,LNode是结点变量,LinkList是结点指针变量,等同于LNode*

typedef struct LNode{		// 定义单链表节点类型 
	int data;
	struct LNode *next; 
}LNode,*LinkList;

例1、错误的方法:初始化带头结点的单链表

void InitList(LinkList L)
{	
	L = (LinkList)malloc(sizeof(LNode));
	L->data = 3;
 L->next = NULL;
}

void Empty(LinkList L)
{
	if(NULL == L)
	{
		printf("链表不存在\n"); 
	}
	else if(NULL == L->next)
	{
		printf("空表\n"); 
	} 
} 

int main()
{
 	LNode p;
 	p.data = 2;
 	printf("p.data = %d\n",p.data);
 	
 	LinkList L = NULL;
	InitList(L);
	printf("L->data = %d\n",L->data);
 return 0;
}

输出结果

p.data = 2
链表不存在

例2、正确的方法:初始化带头结点的单链表

void InitList(LinkList *L)
{	
	(*L) = (LinkList)malloc(sizeof(LNode));
	(*L)->data = 3;
	(*L)->next = NULL;
}

void Empty(LinkList L)
{
	if(NULL == L)
	{
		printf("链表不存在\n"); 
	}
	else if(NULL == L->next)
	{
		printf("空表\n"); 
	} 
} 

int main()
{
 	LNode p;
 	p.data = 2;
 	printf("p.data = %d\n",p.data);
 	
 	LinkList L = NULL;
	InitList(&L);
	printf("L->data = %d\n",L->data);
 return 0; 
}

输出结果

p.data = 2
空表
L->data = 3

为什么第一个 InitList(LinkList L)函数不能初始化单链表L呢?不是用的地址传递吗?

答:

问题就在于L = (LinkList)malloc(sizeof(LNode));

这里的 L 是InitList函数的形参,也就是局部变量,函数运行结束后就不存在了。

而main函数中的 L 指针变量,实际上是存储在全局变量中的,两个L不是同一个L。

例1中,main函数中的 LinkList L 一开始是指向 NULL的

从InitList(L)执行开始,虽然InitList函数中也是对L进行操作,但是此时的L 是InitList函数中的形参L ,之后的也都是对于形参的操作,如下图

例1 中传入的是LinkList 变量L,属于一级指针,不能对实参指针变量 L本身进行操作,来修改实参 L 的值,使得L指向新分配的LNode,所以实参 L 还是指向NULL,因为输出结果“链表不存在”。

例2中,传入的是LinkList 变量的指针 &L,属于二级指针,可以对实参指针变量 L 本身进行操作,来修改实参 L 的值,使得L指向新分配的LNode,(*L) = (LinkList)malloc(sizeof(LNode));

总结

到此这篇关于C语言中指针变量坑的文章就介绍到这了,更多相关C语言指针变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现学生信息管理系统

    C++实现学生信息管理系统

    这篇文章主要为大家详细介绍了C++实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++中stringstream的用法和实例

    C++中stringstream的用法和实例

    下面小编就为大家带来一篇C++中stringstream的用法和实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言strlen函数全方位讲解

    C语言strlen函数全方位讲解

    在C语言中我们要获取字符串的长度,可以使用strlen函数,strlen函数计算字符串的长度时,直到空结束字符,但不包括空结束字符,因为 strlen函数时不包含最后的结束字符的,因此一般使用strlen函数计算的字符串的长度会比使用sizeof计算的字符串的字节数要小
    2022-09-09
  • 贪心算法 WOODEN STICKS 实例代码

    贪心算法 WOODEN STICKS 实例代码

    贪心算法 WOODEN STICKS 实例代码,需要的朋友可以参考一下
    2013-05-05
  • C语言实现单元测试的示例详解

    C语言实现单元测试的示例详解

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这篇文章主要为大家介绍了C语言实现单元测试的方法,需要的可以参考一下
    2022-09-09
  • Matlab实现统计集合中各元素出现次数的示例代码

    Matlab实现统计集合中各元素出现次数的示例代码

    统计数组中各个元素数量是一个很常用的功能,本文主要为大家介绍了如何利用Matlab优雅的统计集合中各元素出现的次数,感兴趣的可以了解一下
    2022-05-05
  • C++ std::initializer_list 实现原理解析及遇到问题

    C++ std::initializer_list 实现原理解析及遇到问题

    这篇文章主要介绍了C++ std::initializer_list 实现原理勘误,本文通过源码解析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Visual Studio 2022 配置 PCL 1.12.1 的问题小结

    Visual Studio 2022 配置 PCL 1.12.1 的问题小结

    这篇文章主要介绍了Visual Studio 2022 配置 PCL 1.12.1 的经验总结分享,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 使用ShellClass获取文件属性详细信息的实现方法

    使用ShellClass获取文件属性详细信息的实现方法

    本篇文章是对ShellClass获取文件属性详细信息的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • ubuntu系统vscodeC++编译环境配置与使用方式

    ubuntu系统vscodeC++编译环境配置与使用方式

    这篇文章主要介绍了ubuntu系统vscodeC++编译环境配置与使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论