热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言指针的应用与价值探讨与阐述

本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。

C语言是计算机软件领域最为经典的编程语言之一,尤其在底层驱动、硬件控制等应用领域,更是C语言的价值所在,这是JAVA,C#等新兴高级语言所不具备的优势所在,通过C语言的指针操作系统内存,以及位运算控制系统的各个外部I/O端口,C语言被广泛应用到硬件系统的控制中,指针的应用是C语言的灵魂,指针实现了C语言的灵活性、可变性。以下对C语言中指针的应用与价值进行探讨与阐述。

C语言编程过程中,假设定义一个变量,编译时就为这个变量分配一定长度的内存空间。而在内存区每一个内存单元都有一个地址,用来标识内存单元,在地址所标识的单元存放数据。而正确使用指针变量,区分指针变量和指针的指向变量的含义和用法,判断变量与运算符的结合顺序来确定变量的数据类型以及指向变量或成员变量的类型。通过指针来访问数组元素和下标法数组元素的等价关系,作为函数参数的指针变量,可以改变所指向的主调函数变量的值。动态存储分配、对链表的创建以及相关操作都可以运用指针实现。

类成员的指针,类成员与外部变量相互比较,进行区分的方法就是它所在的域的不同,因为域的不同而决定了变量可以使用的范围,一个指向类的成员函数或者成员变量的指针,就要规范它的参数列表、返回类型,以及被指向变量或函数的域,所以使用类域限定如下:

classNJUPT{ staticdoublenumber=20000000; intnum; public: NJUPT():num(10){}; intget(){returnnum;}; doublegetNumber(){reuturnnumber;}}

在这里定义的成员指针为intNJUPT::*p;//指向int型成员变量int(NJUPt::*)p()//指向intf()型成员函数。

那么调用的方式为&#xff1a;cout<&#xff1b;

返回指针的函数&#xff0c;一个函数的接口是它的返回值&#xff0c;C语言可以自定义类型&#xff0c;我们使用引用作为函数的实际参数&#xff0c;或在函数的实际参数中使用指针。使用一个函数返回一个指针很容易将一个局部变量的地址传出来。例如&#xff1a;

UserType*Process(){ UserTypeut(param—list)&#xff1b; //processut&#xff1b; return&&#xff1b;ut&#xff1b;//}

变量在函数运行结束已经被销毁&#xff0c;被传出的地址实际已经不存在被释放了。所以很容易出错。另一点是在运用new的时候。易造成内存泄露。

UserType*Process(){ UserTpye*put&#61;newUserType(param—list)&#xff1b; //processput&#xff1b; returnput&#xff1b;}

在函数内部使用一个new&#xff0c;分配了一个空间传出来。这样就不会发生问题&#xff0c;只是编程过程中通常会忘记在程序的外面把借来的空间还回去而造成内存泄露&#xff0c;所以把函数的参数设定为指针或引用作为代替。

两指针变量相减&#xff1a;所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。例如pf1和pf2是指向同一浮点数组的两个指针变量&#xff0c;设pf1的值为2010H&#xff0c;pf2的值为2000H&#xff0c;而浮点数组每个元素占4个字节&#xff0c;所以pf1—pf2的结果为(2000H—2010H)/4&#61;4&#xff0c;表示pf1和pf2之间相差4个元素。两个指针变量不能进行加法运算。例如&#xff0c;pf1&#43;pf2是什么意思呢&#xff1f;毫无实际意义。

this指针的用处&#xff1a;一个对象的this指针并不是对象本身的一部分&#xff0c;不会影响sizeof(对象)的结果。this作用域是在类内部&#xff0c;当在类的非静态成员函数中访问类的非静态成员的时候&#xff0c;编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说&#xff0c;即使你没有写上this指针&#xff0c;编译器在编译的时候也是加上this的&#xff0c;它作为非静态成员函数的隐含形参&#xff0c;对各成员的访问均通过this进行。例如&#xff1a;调用date.SetMonth(9)SetMonth(&date&#xff0c;9)&#xff0c;this帮助完成了这一转换.

以上是学习指针过程中个人总结出来的观点和方法&#xff0c;希望初学C语言或对指针有迷惑的人给予帮助&#xff0c;以便更好的学好指针、掌握C语言的精髓。



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 测绘程序设计Excel度分秒转换模板附代码超实用版
    本文介绍了测绘程序设计Excel度分秒转换模板附代码超实用版的相关知识,包括准备工作、编写表达式和注意事项。在实际工作中,将GPS实测的经纬度度转换为度分秒是常见需求,本文提供了在Excel中快速进行转换的方法,以提高工作效率。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
一个不起眼的小人物
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有