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
相关文章:

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

go学习笔记
1基础搭建 1.1,安装vscode https://code.visualstudio.com/download 64位 1.2,Windows 下搭建Go 开发环境-安装和配置 SDK SDK 的全称(Software Development Kit 软件开发工具包) Go 语言的官网为:golang.org , 因为各种原因,可…...

MacApp自动化测试之Automator初体验
今天我们继续讲Automator的使用。 初体验 启动Automator程序,选择【工作流程】类型。从资源库区域依次将获取指定的URL、从网页中获得文本、新建文本文件三个操作拖进工作流创建区域。 然后修改内容,将获取指定的URL操作中的URL替换成https://www.cnb…...
Vue学习v-html
Vue学习v-html 一、前言1、基本用法2、注意事项 二、总结 一、前言 学习 Vue.js 中的 v-html 指令意味着你想要在你的应用程序中动态地渲染 HTML。这个指令允许你将数据中包含的 HTML 代码直接插入到你的模板中,而不是将其作为纯文本处理。虽然这个功能非常强大&am…...
C++并发:锁
一、前言 C中的锁和同步原语的多样化选择使得程序员可以根据具体的线程和数据保护需求来选择最合适的工具。这些工具的正确使用可以大大提高程序的稳定性和性能,本文讨论了部分锁。 二、std::lock 在C中,std::lock 是一个用于一次性锁定两个或多个互斥…...
Git | git log 和 git status 的区别
如是我闻: git log和git status是Git中的两个非常有用的命令,它们用于不同的目的,并提供不同类型的信息。 git log git log命令用于显示一个或多个分支的提交历史记录。这个命令会列出提交历史,包括每次提交的SHA-1哈希值、提交…...

Django 4.x 智能分页get_elided_page_range
Django智能分页 分页效果 第1页的效果 第10页的效果 带输入框的效果 主要函数 # 参数解释 # number: 当前页码,默认:1 # on_each_side:当前页码前后显示几页,默认:3 # on_ends:首尾固定显示几页&#…...

java-spring 09 下.populateBean (方法成员变量的注入@Autowird,@Resource)
1.在populateBean 方法中的一部分:用于Autowird,Resource注入 // 后处理器已经初始化boolean hasInstAwareBpps hasInstantiationAwareBeanPostProcessors();// 需要依赖检查boolean needsDepCheck (mbd.getDependencyCheck() ! AbstractBeanDefinitio…...

赛氪网携手众机构助力第七届京津冀生态修复实践论坛圆满落幕
近日,由北京生态修复学会联合工业固废网、中国老科协国土资源分会共同主办,赛氪网作为支持单位的第七届京津冀生态修复实践论坛在北京温德姆酒店圆满落幕。本次论坛汇聚了众多行业专家、学者以及企业代表,共同探讨生态修复领域的新技术、新方…...

Naive RAG 、Advanced RAG 和 Modular RAG 简介
简介: RAG(Retrieval-Augmented Generation)系统是一种结合了检索(Retrieval)和生成(Generation)的机制,用于提高大型语言模型(LLMs)在特定任务上的表现。随…...

Python高级编程-DJango2
Python高级编程-DJango2 没有清醒的头脑,再快的脚步也会走歪;没有谨慎的步伐,再平的道路也会跌倒。 目录 Python高级编程-DJango2 1.显示基本网页 2.输入框的形式: 1)文本输入框 2)单选框 3ÿ…...
bash脚本 报错:/bin/bash^M:解释器错误: 没有那个文件或目录
bash脚本 报错:/bin/bash^M:解释器错误: 没有那个文件或目录 出现这个问题是因为该脚本文件在windows下编辑过 在windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,那么你在windows下编辑过的文件在linux下打…...

win10专业版远程桌面连接不上,win10专业版远程桌面连接不上常见原因与解决方法
Win10专业版远程桌面连接功能是一项非常实用的工具,它允许用户远程访问和操作另一台计算机。然而,有时在尝试进行远程桌面连接时,可能会遇到连接不上的情况。本文将分析导致这一问题的常见原因,并提供相应的解决方法。 一、常见原…...
前端 日期 new Date 少0 转换成 yyyy-MM-dd js vue
在console控制台直接输出new Date(),是这样: Fri May 10 2024 23:36:06 GMT0800 (中国标准时间) 输出new Date().toLocaleString(),是这样: 2024/5/10 23:36:06 输出new Date().toISOString(),是这样: …...

Linux中的磁盘分析工具ncdu
2024年5月14日,周二上午 概述 ncdu 是一个基于文本的用户界面磁盘使用情况分析工具。它可以在终端中快速扫描目录,并统计该目录下的文件和文件夹的磁盘使用情况,以交互友好的方式呈现给用户。 安装 在 Debian/Ubuntu 系统下,可…...

Angular入门
Angular版本:Angular 版本演进史概述-天翼云开发者社区 - 天翼云 安装nodejs:Node.js安装与配置环境 v20.13.1(LTS)-CSDN博客 Angular CLI是啥 Angular CLI 是一个命令行接口(Angular Command Line Interface),是开发 Angular 应用的最快、最…...

Java进阶11 IO流、功能流
Java进阶11 IO流-功能流 一、字符缓冲流 字符缓冲流在源代码中内置了字符数组,可以提高读写效率 1、构造方法 方法说明BufferedReader(new FileReader(文件路径))对传入的字符输入流进行包装BufferedWriter(new FileWriter(文件路径))对传入的字符输出流进行包装…...

windows 安装 Conda
1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软件。一般用conda来维护多个python版本。 2 安装…...

IPsec VPN简介
什么是IPsec? IPsec(Internet Protocol Security)是为IP网络提供安全性的协议和服务的集合,它是VPN(Virtual Private Network,虚拟专用网)中常用的一种技术。其实就是一种协议簇(类…...

探索 Canva 的功能以及如何有效使用 Canva
『创意瞬间变现!Canva AI Drawing 让你的文字描绘成艺术』 在数字设计和创意领域,Canva 是创新和用户友好性的灯塔。这个平台不仅简化了图形设计,还引入了 AI Drawing 等强大工具,使其成为专业人士和初学者的首选解决方案。让我们…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...