当前位置: 首页 > news >正文

嵌入式C语言:指针

目录

1.指针概述

1.1 指针的使用

1.2 地址

1.3 指针

1.1 概述

1.2 声明

 1.3 赋值

1.4 指针占几个字节?

1.4 算术运算

2.指针遍历

 2.1  遍历一维数组

2.1.1 练习使用

2.1.2 疑难点

2.2 指针与二维数组 

2.2.1 回顾二维数组

2.2.2 二维数组的三种形式

2.2.3 行指针


1.指针概述
1.1 指针的使用

使用指针可以

① 使程序简洁、紧凑、高效

② 有效地表示复杂的结构

③ 动态分配内存

④ 得到多于一个的函数返回值

1.2 地址

在计算机内存中,每一个字节(即 8 比特,1 Byte = 8 Bit),都有一个编号,即地址。

即内存以字节为单位进行编号

1.3 指针
1.1 概述

指针就是内存单元的地址(即 内存以字节为单位进行编号,这个编号就叫做地址)

专门用来存放地址的变量即指针变量,相当于编号

1.2 声明

声明格式为:存储类型  数据类型  *指针变量名;

<下图是指针的声明,可以借鉴整型的声明;

<下图代码验证 p = &a;

指针变量也要占据存储空间

于是,可以这样理解:

 引入指针时,注意程序中三种表示方法的不同意义:

<以下代码

 1.3 赋值

给指针变量赋值,值必须是地址常量 / 指针变量 / 0

不能是普通的整数

①将一个已有地址值的指针变量赋给具有相同数据类型的另一个指针变量

②把一个数组的地址赋给具有相同数据类型的指针

1.4 指针占几个字节?

64 位操作系统指针占 8 个字节

32 位操作系统指针占 4 个字节

1.4 算术运算

指针运算的实质是对地址的操作

仅包括 赋值运算,算术运算,关系运算

(1):+  与  -  ;

① px + / - n :px + / -  sizeof( px 的类型) * n ;

<下图是验证:

px - py :两指针相减表示相隔数据的个数

 ③ 指针++,++指针 

指针++:先赋值再运算;

++指针:先运算再赋值;               

<下图是验证:稍微简单的 指针++

 <下图是验证:指针++ 之后再复制;

2.指针遍历
 2.1  遍历一维数组

a[i]  p[i]  *(p+i)   *(a+i)  具有完全相同的功能:访问数组第 i 个元素;

有以下说明:

① *( p + i ):指针与常量的算术运算,结果为地址:( p + 该数据类型所占字节 * i )

p是一个地址,可以参与算术运算

a也是一个地址,当然也可以参与算术运算

只不过a是常量,p是变量,且a参与算数运算过程中并没有改变自身的值;

其他可由 p = a ,推导而来;

② 此外,这并不违反数组地址是常量不可修改。

如 *(a+i) 中, (a + i ) 并不等于 a = (a + i),只是借助 a 的地址进行运算,并没有修改 a 的地址

③  a 与 p 在使用上是相同的,但也存在一些区别:

如 a 是数组名,是一个常量,不可以 a++,a--

p 是指针变量,是一个变量;

 <以下代码是验证上述四种形式的表达是否一致:

2.1.1 练习使用

1. <以下 数组与指针的联合使用 恰恰体现了指针灵活方便 的优点:

1. 首先注意输入与输出的格式;

2. 其次注意第十行,若没有该行代码,则结果不正确;

        原因如下:第九行结束时 pa = & a [ 6 ],若不重新置为 a [ 0 ],接下来 *pa++ 要输出

a[6] - a[11],C语言没有对数组溢出报错,结果会随机赋值;

3. 第 9 行:pa++ 相当于 &a[ i ++ ] ;第 12 行  *pa++,++ 的优先级远远大于 *,相当于 *(pa++);

2. 该题较好的考察其知识点;

 

3. 数组逆序输出

 <以下是数组的逆序输出:

        循环判断条件:p < d;

2.1.2 疑难点

<如下,p[ 1 ] = 5,不等于 3;

2.2 指针与二维数组 
2.2.1 回顾二维数组

首先回顾一下二维数组:

二维数组元素连续存储以行优先

如下,在计算机中的存储如右图所示,但为了方便,我们一般按照左图书写

2.2.2 二维数组的三种形式

方式一:一般思维,将二维数组 int a [ m] [ n ] 含有 m*n 个元素按平常方法遍历出来;

在遍历二维数组之前须搞懂一个问题:p = a 合适吗?

 从结果看,并不合适;

p = &a[0][0] 才是正确的;

据此遍历:

方式二:二维数组的地址是连续的

如 int  a [ 3 ][ 2 ] 可以看作六个地址连续的元素,即长度为 6 的一维数组,数组名即起始地址; 

我们来验证一下,a【0】是什么?

可以看到,a[0] 是看作的 “一维数组”的起始地址;

<据此遍历,代码如下:

方式三:行指针遍历二维数组(见 2.2.3);

二位数数组由多个一维数组组成;

数组名 + 1,移动一行元素;

因此,二维数组名(a[0],a[1],a[2])常被称为行地址

 <以下是重要代码:

2.2.3 行指针

行指针即数组指针

存储行地址的指针变量,叫做行地址变量

例如,int a[ 2 ][ 3 ] ;int ( *p )[ 3 ] ,这样,p = a 就合情合理了;

行指针遍历二维数组:

http://www.lryc.cn/news/580033.html

相关文章:

  • Jenkins-Email Extension 插件插件
  • ubuntu 18.04配置镜像源
  • ubuntu22桌面版中文输入法 fcitx5
  • 运维打铁:企业云服务解决方案
  • 金融系统中常用的FIX协议
  • 企业电商解决方案哪家好?ZKmall模块商城全渠道支持 + 定制化服务更省心
  • 文本分词 nltk
  • ODS 系统是什么?企业为什么需要搭建 ODS?
  • CentOS配置网络
  • 【Oracle APEX开发小技巧15】多级弹窗关闭子级保留父级
  • 建议大家都去频繁大量地记录自己:让目标在笔尖下生根发芽
  • 【银行测试】手机银行APP专项项目+测试点汇总(一)
  • 【烧脑算法】最小字典序:巧用单调栈,从栈底到最优解
  • Jmeter安装使用-测试Java接口
  • iOS IPA 混淆,如何对企业定制 App 做渠道差异化保护
  • 写一个ununtu C++ 程序,调用ffmpeg , 来判断一个数字电影的音频文件mxf 的 采样率(频率),通道数, 采样位数
  • ARMv8 没开mmu执行memset引起的非对齐访问异常
  • 新商品冷启动:基于语义Embedding与GBRT的消费指标预估技术实践
  • chrome插件合集
  • vue 循环无限滚动表格
  • Mint密室 · 猫猫狐狐的“特征选择”囚室逃脱
  • QT5.14.2+VS2019 打包程序找dll(纯QT+Opencv程序)
  • 鸿蒙开发List长按Item拖拽切换效果
  • kali安装教程
  • CI/CD持续集成与持续部署
  • spring boot项目配置使用minion
  • 【1】确认安装 Node.js 和 npm版本号
  • 3-1 PID算法改进(积分部分)
  • OpenHarmony 5.0 SIM卡信号格没有变化解决方案(修改成符合标准的信号变化)
  • 《探秘JavaScript虚拟列表:解锁高性能渲染的底层逻辑》