C语言(指针)2

                     Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。 

                                3、指针变量类型的意义

                                                3.1指针的解引用

                                                3.2指针 +- 整数

                                                3.3void *类型

                                 4、const 变量

                                                4.1const 修饰变量

                                                4.2const 修饰指针变量

3、指针变量类型的意义

        既然指针变量的大小与类型没有关系,那为什么还要有不同的指针类型呢?

        在某些情况下,指针类型还是有很大意义的。

         3.1指针的解引用

        这里来举一个例子探讨指针变量类型的意义。

        如果对调试还不太熟悉可以看这篇文章 —> VS调试技巧

        观察下面代码在调试时内存中的变化: 

        我们先给a赋值为0x11223344(16进制),在内存窗口可以看到,然后再通过*pa将a该为0,可以看到内存中也发生了相应的改变。

        既然指针变量的大小都是一样的,与指针的类型没有关系,那我们用char *类型来接收a的地址按理说应该也可以,而且&a取出来的地址都是首地址(一个内存空间,大小是1个字节),好像没什么问题。从上面调试的结果来看确实放进去了0x11223344这个值。

        我们接着调试看一下结果:

        好像跟我们想的不一样,执行完 *pa = 0;这条语句后只是把最小的地址(一个内存单元)中的值该为了0。这是为什么呢?

         因为,指针类型决定了对指针解引用的时候有多大的权限,也就是一次能操作几个字节这就是指针变量类型的意义。比如:char *类型的指针解引用访问一个字节,int *类型的指针解引用访问4个字节。

        3.2指针+-整数

         观察下面的代码:

        跟我们想的一样,&a、pa、pc的值是一样的,但当我们给&a、pa、pc加一个整数1的时候得到了不一样的结果,通过观察,&a和pa的值都增加了4, 而pc的值只增加了1。其中的原因还是和3.1中一样,我们再来通过下面的图解释一下:

        可以理解为他们走的格数不一样,一个格子就是一个内存单元也就是1个字节空间,a和pa一个是int类型一个是int *类型,所以它们走4个格子;而pc是char *类型,所以它走1个格子。 

        减一个整数也是同样的道理。 

         3.3void *类型

        在指针类型中有一种特殊的类型是 void * 类型的,为无具体类型的指针(泛型指针),这种类型的指针可以用来接收任意类型的地址。但是有一定的局限性,void *类型的指针不能直接进行指针的 +- 整数和解引用运算。了解了上面的内容,这其中的原因相信我们已经心知肚明。

        其实,我们 char *pc = &a;是有问题的,&a取出的地址毕竟是int *类型。虽然能正常运行,但是编译器也有相应的警告:

        但是我们用void *去接受就没有任何问题: 

        虽然void *类型的指针不能直接进行解引用操作也不能 +- 整数的操作, 但是当我们不知道别人给我们传的地址是什么类型的时候,我们就可以放心地去用void *来接收,这就是它的作用。

        一般void *类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果,使得一个函数来处理多种类型的数据。在后面的文章中会深入探讨。 

4、const 变量

        4.1const 修饰变量

        变量变量,顾名思义就是可以改变的量,当我们创建一个整整变量a并赋初值10:int a = 10;如果我们想改变a的值随时就可以改,谁让它是变量呢?

        那如果我们想训练一下这个变量a,让它变得强大,谁都改变不了它,有没有办法呢?

        办法就是使用const修饰,当我们用const修饰了变量a后,它就拥有了常量的属性,我们知道常量是不能被改变的量。

        当变量a被const “训练” 过后,我们再试图去改变它的值,就会发现编译器报错,说a是不可被修改的,变量a得到了 “强化”。

        但是const修饰的变量本质上还是变量,只是不能被修改。我们也可以用例子证明这句话:

        前面的文章中我们说过,创建数组的时候数组长度只能为大于0的整型常量或整型常量表达式,不能包含变量。所以上面的例子就证明了变量a即使被const修饰,具有了常量属性,但本质还是变量。

        4.2const 修饰指针变量

        看了上面的内容,我们可能会有一个想法。

        在4.1中,const修饰变量a后,我们就不能改变a的值了,但上面我们只是直接去改发现改不了,那间接地去改呢?因为上篇文章我们刚了解了一点指针,知道通过指针的解引用操作可以间接地去找到、操作一些值,那这里能不能创建一个指针变量pa,将变量a的地址存到pa中,再解引用pa来实现间接改变a的值呢?

        来实验一下我们的想法:

         可以看到,我们的想法是有道理的,通过指针的解引用操作确实间接地改变了a的值。 

         但是,但是,这样做其实是不对的。这就像门被锁了翻窗户一样,锁门的目的就是为了不让别人进得去房间,我们还为了进去而翻窗户,肯定是不合规矩的。为什么要有const呢?不就是为了让变量具有常属性不能被改变嘛,那我们还去改变它就显得没事找事了。

        不过,虽然大多数的人都是守法公民,但还是有个别不听劝的,非要 “翻窗户”,那有没有办法解决呢?答案肯定是有的,因为我们不能容忍任何一个人不 “遵纪守法”。

        既然指针的解引用可以间接地去改变const修饰的变量的值,那我们干脆把指针变量也用const修饰,因为指针变量也是变量嘛。

        const修饰指针变量时,const可以放到 “ * ” 的左边也可以放到 “ * ” 的右边,这样就会产生三种情况(其中前两种情况的效果是一样的):

        const 放在 “ * ” 的左边:

        可以看到,当我们改变 *pa (也就是改变a)的值的时候,编译器提示错误,但改变 pa 的值是可以的。所以,当const在 “ * ” 左边的时候修饰的是*pa ,这时候*pa具有常量属性

        上面代码中改变pa的值事实上是改变了指针变量pa的指向,也就是此时指针变量pa里面存的是变量b的地址。

        const 放在 “ * ” 的右边:

        可以看到,当const在 “ * ” 右边的时候,改变*pa的值是可以的,但改变指针变量pa的指向,也就是改变指针变量pa里存的地址是不可行的。 所以,当const在 “ * ” 右边的时候修饰的是pa,这时候pa具有常量属性。

        还有,当 “ * ” 的左边和右边都有const修饰的时候,*pa和pa都具有常量属性,都不能改变。

        如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。

                                          点击跳转下一节 —> C语言(指针)3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听说SOLIDWORKS科研版可以节约研发成本?

近几年来,政府越来越重视科研带动产业,绩效优良的产业技术研究院对于国家和地区的学术成果转化、技术创新、产业发展等具有不可忽视的促进和带动作用。研究院会承担众多新产业的基础研究工作,而常规的基础研究需要长期的积累,每个…

JAVA毕业设计141—基于Java+Springboot+Vue的物业管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的物业管理系统(源代码数据库)141 一、系统介绍 本项目前后端分离,分为管理员、员工、用户三种角色(角色权限可自行分配) 1、用户: …

高清模拟视频采集卡CVBS四合一信号采集设备解析

介绍一款新产品——LCC261高清视频采集与编解码一体化采集卡。这款高品质的产品拥有卓越的性能表现和丰富多样的功能特性,能够满足广大用户对于高清视频采集、处理以及传输的需求。 首先,让我们来了解一下LCC261的基本信息。它是一款基于灵卡技术研发的高…

LeetCode2095删除链表的中间节点

题目描述 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。对于 n 1、…

深入探索Android签名机制:从v1到v3的演进之旅

引言 在Android开发的世界中,APK的签名机制是确保应用安全性的关键环节。随着技术的不断进步,Android签名机制也经历了从v1到v3的演进。本文将带你深入了解Android签名机制的演变过程,揭示每个版本背后的技术细节,并探讨它们对开…

浅谈下MYSQL表设计的几条规则

作为后端开发人员,避免不了和数据库打交道,可是我们怎么能够设计出高效,可维护,可扩展的数据库设计呢,在这里我总结了几个点,供大家参考。 在写之前,可能需要重复下数据库设计的范式原则&#…

水雨情监测系统—实时监测水位信息

TH-SW3水雨情监测系统是一种专门用于实时监测和收集水文气象数据的自动化系统。它能够实时获取区域内降雨和水情数据,并将其存储到数据库中进行分析处理,从而为防汛指挥人员提供及时准确的信息服务。 水雨情监测系统的主要功能包括实时监测水位、流速、流…

C++类与对象基础探秘系列(二)

目录 类的6个默认成员函数 构造函数 构造函数的概念 构造函数的特性 析构函数 析构函数的概念 析构函数的特性 拷贝构造函数 拷贝构造函数的概念 拷贝构造函数的特性 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类的成员函数 取地址及const取地址操作…

MySQL文档_下载

可能需要:MySQL下载–》更新版本–》迁移数据库到MySQL 以下都不重要【只要确定好需要安装版本,找到对应的版本下载,安装,设置即可】 下载、安装: Determine whether MySQL runs and is supported on your platform…

Debian12安装后更换为国内镜像源,切换root用户,解决用户名不在sudoers文件中此事将被报告

选择Debian作为编程开发最佳Linux的理由: Debian是面向程序员的最古老,最出色的Linux发行版之一。Debian提供了具有.deb软件包管理兼容性的超稳定发行版。Debian为程序员提供了许多最新功能。因此,它具有一个特殊的编程空间。Debian是开发人员…

弥合孤岛:克服构建 DevOps 文化的挑战

持续变革正在发生软件开发行业。DevOps 因其对自动化、协作和持续改进的关注而成为优化软件交付并弥合开发和运营团队之间鸿沟的重要方法。然而,过渡到真正的 DevOps 文化并非没有挑战。本文探讨了您在追求 DevOps 时可能面临的障碍并提供了解决方案。 01 了解 Dev…

数据结构 顺序表1

1. 何为顺序表: 顺序表是一种线性数据结构,是由一组地址连续的存储单元依次存储数据元素的结构,通常采用数组来实现。顺序表的特点是可以随机存取其中的任何一个元素,并且支持在任意位置上进行插入和删除操作。在顺序表中&#xf…

算法-卡尔曼滤波之基本数学的概念

1.均值 定义:均值是一组数据中所有数值的总和除以数据的数量。均值是数据的中心趋势的一种度量,通常用符号 xˉ 表示。 :对于包含 n 个数据的数据集 {𝑥1,𝑥2,...,𝑥𝑛},均值 xˉ 计…

Spring原理

目录 一、Bean作用域 1、Bean作用域概念 2、Bean的六种作用域 3、举例演示bean的几种作用域 二、Bean的生命周期 1、Bean对象的生命周期 2、演示Bean对象的生命周期 三、SpringBoot的自动配置 1、概念 2、spring将对象存入容器中的原理 一、Bean作用域 在前面spring…

C语言(指针)7

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

6款日常精选手机APP推荐!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.全能相机软件——无他相机 无他相机App是一款完全免费且功能全面的美颜相机软件。这款相机应用集自拍、美颜、图片编辑、风格化模板、流行贴…

springboot+vue+mybatis台球俱乐部管理系统的设计与实现+PPT+论文+讲解+售后

随着信息技术在管理上越来越深入而广泛的应用,作为一般的台球厅都会跟上时代的变化,用上计算机来代表重复性的劳动,并且给用户一种新奇的感受,实现台球俱乐部系统 在技术上已成熟。本文介绍了台球俱乐部系统 的开发全过程。通过分…

k8s v1.20二进制部署 部署 CNI 网络组件 部署 Calico

一、部署 flannel 1.1.K8S 中 Pod 网络通信 ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器(Pod 内的容器是不会跨宿主机的)共享同一个网络命名空间,相当于它们在同一台机器上一样,可以用 localhost 地址访问彼此的端口。…

InternLM-XComposer2-4KHD开拓性的4K高清视觉-语言模型

大型视觉-语言模型(LVLM)在图像字幕和视觉问答(VQA)等任务中表现出色。然而,受限于分辨率,这些模型在处理包含细微视觉内容的图像时面临挑战。 分辨率的限制严重阻碍了模型处理含有丰富细节的图像的能力。…

一个视频AI自动抠像 速度快 操作简单 - RobustVideoMattingGU

RVM的GUI版本: 一款基于Robust Video Matting(RVM)源码的图形用户界面(GUI)版本,采用先进的pyqt6框架和qdarkstyle风格设计,为视频编辑爱好者和二次创作者打造了一个功能丰富的工具箱。这款软件…