C和指针:指针

news2024/12/23 10:37:22
内存和地址

程序视角看内存是一个大的字节数组,每个字节包含8个位,可以存储无符号值0至255,或有符号值-128至127。

多个字节可以合成一个字,许多机器以字为单位存储整数,每个字一般由2个或4个字节组成。

由于它们包含了更多的位,每个字可以容纳的无符号整数的范围是从0至4294967295(2^32-1)。尽管一个字包含了4个字节,它仍然只有一个地址。

它的地址是最左边字节或者最右边字节的位置,不同的机器有不同的规定。另一个需要注意的是边界对齐(alignment)。要求边界对齐的机器上,整型值存储的起始位置只能是特定的字节,通常是2或4的倍数。

内存中的每个位置由一个独一无二的地址标识。

内存中的每个位置都包含一个值。

如果知道一个值的存储地址,可以根据地址取得这个值。但是地址不好记,所以可以通过变量名访问地址的值。

名字与内存位置之间的关联并不是硬件所提供的,是由编译器实现的。

int a = 112,b = -1;
float C = 3.14;
int *d = &a;
float *e = &C;
值和类型

c声明为浮点数,但是存放在内存中使用的整数,它们可以被解释为整数,也可以被解释为浮点数,取决于它们被使用的方式。如果使用的是整型算术指令,这个值就被解释为整数,如果使用的是浮点型指令就是浮点数。

不能检查一个值的位来判断类型。为了判断值的类型,必须观察程序中这个值的使用方式。

指针变量的内容

指针变量存放指针指向变量的地址。

d和e的内容是地址而不是整型或浮点型数值。d的内容与a的存储地址一致,而e的内容与c的存储地址一致,

间接访问操作符

通过一个指针访问指向的地址的值间接访问或解引用指针,间接访问的操作符*。

*d=112

*e=3.14

*&a = 25;

把值25赋值给变量 a。

&产生变量 a的地址,它是一个指针常量。*操作符访问其操作数所表示的地址。表达式中操作数是a的地址,所以值25就存储于 a中。

*(int *)100= 25

强制类型转换把值100从“整型”转换为“指向整型的指针",对它进行间接访问。如果 a存储于位置100,那么这条语句就把值25存储于a。

需要通过地址访问内存中某个特定的位置,它并不是用于访问某个变量,而是访问硬件本身。

未初始化和非法的指针

下面的指针a没有初始化就进行赋值,是非法的。a存放的是一个随机的整数,行为未定义。

int*a;
*a = 12;
NULL指针

NULL指针是一个特殊的指针变量,表示不指向任何东西。要使一个指针变量为NULL,可以给它赋一个零值。为了测试一个指针变量是否为NULL,你可以将它与零值进行比较(源代码约定)。

NULL指针并未指向任何东西,因此对NULL指针进行解引用操作是非法的。在对指针进行解引用操作之前,首先必须确保它并非NULL指针。

指针的指针

int a=12;int *b=&a;int **c=&b;

c的类型是一个指针,b是指向整型的指针,c是一个指向整型指针的指针。

指针表达式

char ch= ’a’;char *cp=&ch;

?为ch后面的内存位置(方便后续使用)。

ch

作为右值使用表示表达式的值为'a'

作为左值使用表示内存的地址而不是该地址所包含的值。

&ch

作为右值表示变量ch的地址,这个值等于变量cp存储的值。

只能作为右值,不能作为左值。

cp:右值是cp的值(存放ch的地址),左值是cp所处的位置(左值一般是等号左面用作赋值)。

&cp:右值表示取指针变量的地址,指向字符指针的指针。左值非法。

*cp:右值表示间接访问ch‘a’。左值表示ch的地址

*cp+1

右值:*优先级高于+,所以执行间接访问操作,得到值‘a’,+1后得到’b’。

左值:非法

*(cp+1)

右值表示?的值。左值表示?的地址

++cp

右值:表达式的结果是增值后的指针的一份拷贝。执行后cp指向?

左值非法

cp++

右值:增加cp的值,执行后cp指向?。但先返回cp值的一份拷贝再增加cp的值。表达式的值式cp原来值的一份拷贝。左值非法。

*++cp

右值:间接访问操作符作用再增值后的指针的拷贝上,表示?的值。

左值:表示?内存地址。

*cp++

右值和左值分别是变量ch的值和ch的内存位置。cp指向?

后缀++操作符的优先级高于*操作符。

(1)++操作符产生cp的一份拷贝.

(2)++操作符增加 cp的值.

(3)在cp的拷贝上执行间接访问操作.

++ *cp

右值表示ch变为b,左值非法

(*cp)++

与12类似,结果是ch增值前的值(‘a’),但是ch的值变为’b’。

++*++cp

*++cp,需要做的只是增加它的结果值。

指针运算

当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。合适的大小就是指针所指向类型的大小,调整就是把整数值和合适的大小相乘。

算术运算

(1)指针士 整数

指向数组中某个元素的指针

#define N_VALUES 5
float values[N_VALUES]; 
float *vp;
for( vp = &values[0]; vp< &values[N_VALUES];)
*vp++ = 0;

for语句的初始部分把 vp指向数组的第1个元素。

经过第1次循环之后

经过5次循环之后,vp就指向数组最后一个元素后面的那个内存位置。

(2)指针 一 指针

只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针,两个指针相减的结果的类型是 ptrdiff_t,它是一种有符号整数类型。减法运算的值是两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位),因为减法运算的结果将除以数组元素类型的长度。

关系运算

指针都指向同一个数组中的元素可以进行关系运算,判断哪个指针在数组的前面或后面。

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

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

相关文章

react native(expo)多语言适配

项目基于 expo框架 开发。请先配置好 expo 开发环境 1.引入i18n-js npx expo install i18n-js 2.新建languages文件夹&#xff0c;其中包括英文、中文等语种目录。结构如下&#xff1a; *.json文件为语种翻译后的json键值对&#xff0c;用于UI中引用; { "appName&q…

【C语言】(指针系列3)数组指针+函数指针+typedef+函数数组指针+转移表

前言&#xff1a;前言&#xff1a;开始之前先感谢一位大佬&#xff0c;清风~徐~来-CSDN博客&#xff0c;由于是时间久远&#xff0c;博主指针的系列忘的差不多了&#xff0c;所以有顺序部分借鉴了该播主的&#xff0c;同时也加入了博主自己的理解&#xff0c;有些地方如果解释的…

MySQL语句案例编写复习

先看我的表数据和结构 1.查询年龄为16,17,18,19岁的女性员工信息。 select * from emp where gender 女 and age in(16,17,18,19); 2.查询性别为 男 &#xff0c;并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。 select * from emp where gender 男 and age between …

猫罐头多久喂一次?营养健康的罐头推荐

一&#xff0e;猫罐头多久喂一次 猫咪长期只食用干粮&#xff0c;容易饮水不足&#xff0c;从而引发上尿道或膀胱结石、堵塞等问题&#xff0c;所以最好每周喂至少2个猫罐头&#xff0c;帮助猫咪补充水分。如果条件允许&#xff0c;全罐喂养&#xff0c;每天都给猫咪吃猫罐头是…

车机中 Android Audio 音频常见问题分析方法实践小结

文章目录 前言1. 无声2. 断音3. 杂音4. 延迟播放5. 焦点问题6. 无声问题(连上 BT )其他完善中…… 前言 本文主要总结了一下车机开发中遇到的 Audio 有关的问题&#xff0c;同时参考网上的一案例&#xff0c;由于Audio 模块出现音频问题的场景很多&#xff0c;对每一个出现的问…

Blender渲染太慢怎么办?blender云渲染已开启

动画行业蓬勃发展&#xff0c;动画制作软件亦持续推陈出新&#xff0c;当制作平台日益丰富&#xff0c;创作难度降低&#xff0c;创作效率提升&#xff0c;如何高效完成复杂动画的渲染就成了从业者更关心的问题。 云渲染技术的出现&#xff0c;无疑为动画制作者提供了前所未有…

家庭理财管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 家庭理财管理系统拥有多种角色&#xff0c;可以自行设置权限和用户等&#xff0c;主要功能有&#xff1a; 收入管理、支付管理、资产管理、负债详情、统计报表、家庭成员管理、用户管理等…

JavaSE - 易错题集 - 006

1. 哪个正确 A abstract类只能用来派生子类&#xff0c;不能用来创建abstract类的对象。 B final类不但可以用来派生子类&#xff0c;也可以用来创建final类的对象。 C abstract不能与final同时修饰一个类。 D abstract类定义中可以没有abstract方法。 正确答案&#xff1…

决策树算法上篇

决策树概述 决策树是属于有监督机器学习的一种&#xff0c;起源非常早&#xff0c;符合直觉并且非常直观&#xff0c;模仿人类做决策的过程&#xff0c;早期人工智能模型中有很多应用&#xff0c;现在更多的是使用基于决策树的一些集成学习的算法。 示例一&#xff1a; 上表根据…

1.C++中程序的基本结构

在教孩子的学习过程中&#xff0c;使用的开发IDE为小熊猫Dev-C 6.7.5版本&#xff0c;以后的复杂截图&#xff0c;基本上都是基于此版本进行的&#xff0c;同时在适当的时候&#xff0c;录制视频也会基于此版本来完成。 以下为一个最基本的C程序 int main() {// 程序主体retur…

无痛生娃,00后当妈啦

姐妹们&#xff0c;你们家开始催婚了吗&#xff1f;我是00后&#xff0c;大学也才毕业一年啊&#xff0c;我妈已经开始给我物色对象&#xff0c;过年让我去相亲了&#xff01;大学的时候不让谈&#xff0c;说怕异地以后感情不稳定&#xff0c;结果呢&#xff0c;一毕业要我结婚…

频域滤波为什么使用psf2otf函数?线性卷积和循环卷积等效的条件

线性卷积和循环卷积是本质不同的运算。然而&#xff0c;在某些条件下&#xff0c;线性卷积和循环卷积是等效的。建立这种等效关系具有重要意义。对于两个向量 x 和 y&#xff0c;循环卷积等于二者的离散傅里叶变换 (DFT) 之积的逆 DFT 变换。 禹晶、肖创柏、廖庆敏《数字图像处…

基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

『功能项目』项目优化 - 框架加载资源【41】

我们打开上一篇40播放动画时禁止点击移动的项目&#xff0c; 本章要做的事情是搭建一个资源加载框架&#xff0c;让UI界面&#xff0c;人物模型以及场景都存放在资源文件夹中在运行时加载出来 首先在资源商店加载资源 将怪物模型放置场景中 将普通管线模型切换成URP 重命名为…

重学SpringBoot3-集成RocketMQ(二)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成RocketMQ&#xff08;二&#xff09; 1. 基础概念2. 准备工作3. 实现事务消息的生产者4. 事务监听器实现5. 消费者示例6. 发送事务消息7. 测试7.1 模…

rust学习——关联类型

什么是关联类型 关联类型是Rust中一种特殊的泛型抽象机制。在trait中&#xff0c;可以定义一个或多个关联类型&#xff0c;这些关联类型与trait的实现类型相关联。关联类型允许我们在trait中使用泛型&#xff0c;但不需要提前指定具体的类型。 不使用关联类型存在的问题 tra…

AI生成头像表情包,一次十分钟,就能实现月入过万的玩法,无脑操作

今天给大家带来的项目是AI生成表情包和头像&#xff0c;这个项目对于我们做ip来说是真心不错&#xff0c;就比如我这个头像。 为什么说每天只需要10分钟呢&#xff0c;那么我们继续往下看。 "项目介绍 这个项目的核心其实就是使用AI生成表情包或者说生成头像&#xff0c…

华为HCIA、HCIP和HCIE认证考试明细

华为认证体系包括三个主要等级&#xff1a;HCIA&#xff08;华为认证ICT助理&#xff09;、HCIP&#xff08;华为认证ICT高级工程师&#xff09;和HCIE&#xff08;华为认证ICT专家&#xff09;。每个等级的认证都有其特定的考试内容和费用。 HCIA&#xff08;华为认证ICT助理…

天翼云2024年最新版本认证必过资料(应知+从业者+解决方案架构师+高级解决方案架构师)

本资料为2024年认证最新材料&#xff0c;笔者因为工作需要考几个认证。天冀云全套认证包含如下图所示&#xff0c;本材料包含下图中红框内的 4个认证&#xff08;应知从业者解决方案架构师高级解决方案架构师&#xff09;。 笔者&#xff0c;亲测必过。见文章下面第二张考试记录…

模型加载pytorch版本不匹配的解决思路

模型部署总是会遇到pytorch版本推理与训练不匹配的问题&#xff0c;一般报错&#xff1a; AttributeError: Cant get attribute _rebuild_parameter_v2 on <module torch._utils from /usr/local/python3.9.0/lib/python3.9/site-packages/torch/_utils.py>提示pytorch …