您现在的位置是:群英 > 开发技术 > 编程语言
C语言指针是什么,如何定义和使用
Admin发表于 2022-05-06 17:55:541272 次浏览
这篇文章给大家分享的是“C语言指针是什么,如何定义和使用”,文中的讲解内容简单清晰,对大家认识和了解都有一定的帮助,对此感兴趣的朋友,接下来就跟随小编一起了解一下“C语言指针是什么,如何定义和使用”吧。

 


目录
  • 1.1:概述
    • 1.1.1:内存
    • 1.1.2:内存
    • 1.1.3:指针和指针变量
  • 1.2:指针基础知识
    • 1.2.1:指针变量的定义和使用
    • 1.2.2:通过指针间接修改变量的值
    • 1.2.3:指针的大小
    • 1.2.4:空指针与野指针
    • 1.2.4:万能指针
  • 1.3:指针与数组
    • 1.3.1:数组名
    • 1.3.2:指针操作数组
    • 1.3.3:指针的加减运算
  • 1.4:指针基础小结
    • 1.5:总结

      1.1:概述

      1.1.1:内存

      内存含义:

      • 储存器:用来存储程序和数据,辅助CPU进行运算处理的重要组成部分。
      • 内存:内部存储器,暂时存放程序/数据。
      • 外存:外部储存器,长时间保存程序/数据。

      1.1.2:内存

      内存地址:

      • 可以理解为将内存抽象成一个很大的一维数组。
      • 编码就是将内存的每一个字节分配一个32位或者64位的编号。这个内存编号我们就称为地址

      1.1.3:指针和指针变量

      • 内存中每一个字节都有一个编号,我们称之为”地址“。
      • 指针的实质就是内存的”地址“。地址就是指针,指针也就是地址。
      • 指针是地址,而定义的指针变量是存放地址的变量。

      1.2:指针基础知识

      1.2.1:指针变量的定义和使用

      - 指针是一种数据类型,指针变量是一种存放地址编号的变量。

      -‘*' 解引用操作符,表示指针所指的内存空间的具体内容。

      打印变量的地址:(用%p)


      解引用操作符的运用:


      int * 代表了指针类型,p是定义的指针类型的变量,将a的地址赋给变量P,这是p中存的是a的地址编号,p就指向了a的空间,*P就表示a空间里的内容,也就是a的值。

      1.2.2:通过指针间接修改变量的值

      前面我们提到了关于由const修饰的局部变量的修改,不可以通过赋值直接修改,这里我们介绍通过指针间接的修改变量的值。


      当直接修改由const修饰的常量时,我们可以看出会发生错误。


      这时我们定义一个指针变量间接的修改局部变量的值是可以的!我们用个图来辅助理解:

      1.2.3:指针的大小

      • sizeof() 测得是指针变量指向的储存地址的大小。
      • 在32位平台,所有指针地址都是32位(4字节)。
      • 在64位平台,所有指针地址都是64位(8字节)。

      1.2.4:空指针与野指针

      • 空指针(NULL):主要用于给指针变量初始化,空指针是指向内存地址编号为0的空间。int * P = NULL;
      • 野指针:对我个人理解而言,对于野指针我理解为指向一个未知的空间,(通俗来讲,就是我虽然知道这块内存的地址编号,但是我并不知道这块内存具体存放的是什么内容)。下面我介绍两野指针常见错误。

      ①:任意数值赋值给野指针。

      ②:操作野指针指向的内存区域。

      1.2.4:万能指针

      这里我们不做详细的介绍,void * 指针可以指向任意变量的内存空间:


      特别注意:我们在对万能指针进行操作时,因为系统需要知道具体需要对几个字节的内容进行操作,所以我们需要强转成具体的指针类型。

      1.2.5:const修饰的指针变量

      const修饰指针变量时,因const的位置不同,修饰的意义也有所不同,如下代码:


      对于p1 ,const可以理解为修饰的*p1,也就是修饰的空间的内容,这时这块空间的地址是可以重新赋值的,而内容不可以!

      对于p2,const修饰的是指针变量p2,也就是修饰的空间地址,所以这时可以对内容进行辅助,而不可以改变变量的地址!

      注:在编写程序时,指针作为函数参数传递,如果对应的内存空间的值不会被修改,可以使用const修饰指针数据类型。

      1.3:指针与数组

      1.3.1:数组名

      敲重点:对一维数组来说,数组名是首元素地址,是一个常量!!,不可以修改,切记切记,对二维数组来说,此时数组名也是首元素地址,只不过此时的首元素不再只是一个元素,而是一个一维数组。

      1.3.2:指针操作数组

      其实博主觉得,用指针操作数组可读性还是比较差,而且后续面对多维数组,用指针来操作数组比较麻烦,可读性差。无奈博主学艺不精呀。


      这里*(arr + i) 与arr[i]的效果一摸一样,这里的知识点涉及到指针的加减运算,见下一小节。

      1.3.3:指针的加减运算

      (1) 加法运算

      指针计算绝对不是简单的整数相加,这里与指针类型有关:

      • 如果是一个整型指针,那么+1的效果就是变化一个int的大小。
      • 如果是一个字符型指针,那么+1的效果就是变化一个char的大小。


      此时数组名是首元素1的地址,属于整型指针,+2表示变化2个int的大小,也就是第三个元素的地址。

      (2) 减法运算

      这里对于指针减一个整数的作用与加法如出一辙,也是与指针类型有关。


      这里我们利用一个逆序打印数组来说明指针减法,特别注意 arr与&arr分别+1的区别,arr表示的是首元素地址,&arr表示的是整个数组的地址,arr + 1变化4字节,而&arr + 1 变化的是整个数组大小的字节数(36)。如图:



      我们可以看出,打印&arr与arr的地址编号是一样的,但是意义是不一样的。 1.3.4:指针数组

      指针数组还是一个数组,数组元素都是指针类型,拿一级指针数组举例:


      这里博主提一点自己对一级指针数组的理解,希望对大家有一丢丢帮助,一级指针数组我把它与二级指针、二维数组相对应,这里不做详细解释,后续指针强化我会解释我的理解,这种理解可能按官方说法来说不严谨,但是能帮助我们理解就好。

      1.4:指针基础小结

      • int i:定义整型变量
      • int * p:定义一个指向int的指针变量
      • int **p:定义一个二级指针,指向一级指针。
      • int arr[10]:定义一个有10个整型元素的数组。
      • int *arr[10]:定义一个有10个一级指针元素的数组。

      1.5:总结



      感谢各位的阅读,以上就是“C语言指针是什么,如何定义和使用”的内容了,通过以上内容的阐述,相信大家对C语言指针是什么,如何定义和使用已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注群英网络,群英网络将为大家推送更多相关知识点的文章。

      免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

      标签: c语言指针
      相关信息推荐
      2022-11-12 17:41:48 
      摘要:Vue项目中怎么用Pinia状态管理工具?下面本篇文章带大家聊聊Vue项目中Pinia状态管理工具的使用,希望对大家有所帮助!
      2022-05-06 17:55:55 
      摘要:类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数
      2022-01-20 19:45:14 
      摘要:用PHP怎样生成不重复的10位会员编码?很多场景中都会遇到将一个庞大的数据进行编号,例如证件号码、车牌号、订单流水号等等,这里以实现10位不重复的会员编码为了,给大家分享一下这个功能要如何来实现。
      云活动
      推荐内容
      热门关键词
      热门信息
      群英网络助力开启安全的云计算之旅
      立即注册,领取新人大礼包
      • 联系我们
      • 24小时售后:4006784567
      • 24小时TEL :0668-2555666
      • 售前咨询TEL:400-678-4567

      • 官方微信

        官方微信
      Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
      增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
      免费拨打  400-678-4567
      免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
      微信公众号
      返回顶部
      返回顶部 返回顶部