C语言(指针)2

news2024/12/26 11:38:25

                     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.coloradmin.cn/o/1663277.html

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

相关文章

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时,客户问:在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?针对这个问题,启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

又一位互联网大佬转行当网红,能写进简历么?

最近半个月,有两个中年男人仿佛住进了热搜。 一个是刚刚辟谣自己“卡里没有冰冷的 40 亿”的雷军,另一个则是在今年年初就高呼“如果有可能,企业家都要去当网红”的 360 创始人周鸿祎。 他也确实做到了。 先是作为当年 3Q 大战的当事人&…

企业破产重整:从“至暗时刻”到“涅槃重生”

今天我们不谈星辰大海,而是要潜入商业世界的深海区,探索那些濒临绝境的企业是如何借助“破产重整”的神秘力量,实现惊天大逆转的! 一、破产重整,到底是个啥? 想象一下,企业像是一位远航的船长…

Map按value降序并统计

package com.ldj.cloud.user.demo;import java.util.*;/*** User: ldj* Date: 2024/5/11* Time: 10:03* Description: map按value降序*/ public class Tr {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();list.add("a&q…

在家就可以轻松赚零花钱的副业

互联网的兴起让很多人实现了在家办公的梦想&#xff0c;同时也为人们提供了更多的挣钱方式。以下是4种可以在家中兼职副业赚钱的方法&#xff1a; 1. 写作工作 如果你善于写作&#xff0c;并且有一定的文学素养&#xff0c;那么可以通过自己的博客或其他媒体平台来写作&#…

4. 初探MPI——集体通信

系列文章目录 初探MPI——MPI简介初探MPI——&#xff08;阻塞&#xff09;点对点通信初探MPI——&#xff08;非阻塞&#xff09;点对点通信初探MPI——集体通信 文章目录 系列文章目录前言一、集体通信以及同步点二、MPI_Bcast 广播2.1 使用MPI_Send 和 MPI_Recv 来做广播2.…

【一站式学会Kotlin】第四节默认参数和具名参数、unit返回值类型

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我交流Android、微信小程序、鸿蒙项目。文章底部&#xff0c;csdn有为我插入微信的联络方式&#xff0c;欢迎大家联络我。 一&#x…

按键的短按、长按和连续的划分

在实际生活中&#xff0c;我们使用到的按键在短按、长按和按键松开时都会触发不同的功能。按键短按后松开和长按后松开的应用比短按和长按的应用较少&#xff0c;我了解的按键短按后松开和长按后松开的应用是在点动控制和长动控制中。这里主要讨论按键的短按、长按和连续这三种…

用Xinstall实现智能信息的无缝传递

在这个信息化的时代&#xff0c;智能信息的传递显得尤为重要。无论是对于个人还是企业&#xff0c;高效、准确的信息传递都是成功的关键。然而&#xff0c;随着科技的飞速发展&#xff0c;传统的信息传递方式已经无法满足我们的需求。这时&#xff0c;Xinstall应运而生&#xf…

Linux的命令(第二篇)

昨天学习到了第17个命令到 rm 命令&#xff08;作用删除目录和文件&#xff09;&#xff0c;今天继续往下里面了解其他命令以及格式、选项&#xff1a; &#xff08;17&#xff09;wc命令&#xff08;此wc非wc&#xff09; 作用&#xff1a;统计行数、单词数、字符分数。 格…

UEC++ FString做为参数取值时报错error:C4840

问题描述 用来取FString类型的变量时报错&#xff1a; 问题解决 点击错误位置&#xff0c;跳转到代码&#xff1a; void AMyDelegateActor::TwoParamDelegateFunc(int32 param1, FString param2) {UE_LOG(LogTemp, Warning, TEXT("Two Param1:%d Param2:%s"), param…

AutoCAD中密集的填充打散后消失的问题

有时候在AutoCAD中&#xff0c;图案填充的填充面积过大或填充太过密集时&#xff0c;将该填充打散&#xff0c;也就是执行Explode时&#xff0c;会发现填充图案消失了。 原因是打散后线条太大&#xff0c;系统就不显示了。可以通过设置&#xff1a;HPMAXLINES 值&#xff0c;来…

爬虫学习:XPath提取网页数据

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令&#xff1a;pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言&#xff0c;可以使用它在HTM…

echarts自定义图例显示名称、数值、占比

先上代码 legend: {orient: vertical,left: 10,top:20,data: data,textStyle: {color: #9FB7D5 // 设置图例文字颜色为白色},// type: plain, // 设置图例类型为普通类型itemWidth: 10, // 设置图例项的宽度itemHeight: 10, // 设置图例项的高度formatter: function(name) {let…

通用人工智能AGI,究竟是一个哲学问题还是技术问题?

引言 在探索人工智能的未来方向中&#xff0c;人工通用智能&#xff08;AGI&#xff09;的概念逐渐成为科技领域和哲学探讨的焦点。AGI旨在创建可以执行任何智能任务的机器&#xff0c;甚至在某些方面超越人类的能力。然而&#xff0c;关于AGI的研究不仅仅是技术问题&#xff…

WebSocket基础知识

WebSocket是什么&#xff1f; WebSocket 是一种网络通信协议&#xff0c;它提供了全双工通信机制&#xff0c;允许服务器主动向客户端发送消息&#xff0c;而不仅限于响应客户端的请求。它使用类似于 HTTP 的握手来建立连接&#xff0c;然后使用单独的持久连接来进行通信。这种…

vue2 八大组件通信,父子通信,跨层级通信,事件总线,vuex等

文章目录 什么是组件通信&#xff1f;父子通信流程propsProps 定义Props 作用特点数组写法对象写法&#xff08;props校验&#xff09;简写只验证数据类型&#xff1a;完整写法&#xff0c;完整的验证&#xff1a; props父向子传值用props父传子在子组件中修改props $emit子向父…

美国政府发布新的国际网络空间和数字政策战略(上)

文章目录 前言一、战略内容介绍二、数字团结的含义三、如何建立数字团结前言 美国务院5月6日正式发布《美国国际网络空间和数字政策战略:迈向创新、安全和尊重权利的数字未来》,旨在指导国际社会参与技术外交并推动《美国国家安全战略》和《美国国家网络安全战略》。 美国务…

无人售货机开启财富新机遇

创立属于自己的小本事业&#xff0c;却因经验匮乏及风险顾虑望而却步&#xff1f;探索零风险且潜在高收益的创业途径&#xff0c;无人售货机项目脱颖而出&#xff0c;成为理想之选&#xff01; 无人售货机&#xff1a;市场蓝海待挖掘 在消费升级和技术飞跃的双重驱动下&#…

【DDR 终端稳压器】Sink and Source DDR Termination Regulator [C] S0 S1 S2 S3 S4 S5 6状态

TPS51200A-Q1 器件通过 EN 功能提供 S3 支持。EN引脚可以连接到终端应用中的SLP_S3信号。当EN 高电平&#xff08;S0 状态&#xff09;时&#xff0c;REFOUT 和 VO 引脚均导通。当EN 低电平&#xff08;S3状态&#xff09;时&#xff0c;VO引脚关断并通过内部放电MOSFET放电时…