单片机C语言基础知识-指针篇

2023-11-06

引言:指针是变量在计算机或单片机内所占有的存储区域的地址。C51语言中广泛使用的指针概念是从C语言中继承下来的,利用指针变量不但可以操作各种基本的数据类型、,而且能使C51语言像汇编语言一样,具有处理单片机内存地址的能力。

地址,指针,指针变量概念区分

地址: 地址是单片机内存单元的编号。其中内存单元是单片机存储器中的最小存储单位,通常一个字节称为-一个内存单元。

指针:指针是一个特殊变量,其实也是一个地址,表示的是一个变量在内存中的首地址,要明白指针的类型,指针的值,指针所指的类型,指针所指的内存区,才算真正了解了指针。按照这个意思,其实就是 int i =5   则存放变量的内存单元的地址&i被称为指针

指针变量: 指针变量是用来存放指针的一种变量类型。 一个指针变量的值,就是某个内存单元的地址。定义指针的目的,是为了通过指针访问内存单元

数组或函数都是连续存放的,因此通过访问指针变量就可以得到数组或函数的首地址
 

为什么要用指针

简单的说:就是使程序优化,变得高效些,让一般人看不明白

指针变量的声明:

一般格式为:

类型标识符 +*指针名1,*指针名2;

举例:

int *p; //p是指向整型变量的指针变量

char *p;//p是指向字符变量的指针变量

float *p ; //p是指向浮点型变量的指针变量

要特别注意的是:一个指针变量只能指向同类型的数据(想了解更详细的话:可以参考这位大佬的博客很详细【C语言】让你不再害怕指针——C指针详解(经典,非常详细)_码农印象的博客-CSDN博客_指针c语言z

指针变量赋值

指针变量被声明后可以指向任何同类型的变量。如果定义指针变量时不进行初始化,编译系统不能确定它具体的指向,此时该指针变量被初始化为NULL,它的值为0。
在C语言中,我们不知道变量的具体地址,变量的首地址是由编译系统分配的。为此,C51语言中提供了地址运算符“&”,可以获取变量的首地址。其一般形式如下:
&变量名
其中“&”为取地址运算符,变量名为预先声明的变量。例如,&a表示变量a的首地址,&b表示变量b的首地址。
 

指针与指针变量是不一样的,但是我们还是将指针和指针变量混在一起,如果有强迫症的,非要弄清区别,可以看一下这个大佬的博客指针与指针变量的区别(C语言)_暗夜绿的博客-CSDN博客_指针和指针变量的区别

初始化赋值

假设有指向整型变量的指针变量p和整形变量a,如果要将变量a的地址赋予可以采用初始化赋值。

int a;

int *p=&a;  //&a,表示取变量a的首地址  ,是用&a对指针变量p初始化,不是对*p初始化

取地址赋值:

int a ;  int *p;  p=&a;

这两种方式没区别,

错误示范: 

int *p;  p=200;

错误原因:不允许将一个数值赋给指针变量

再举个稍微难点的例子:

int a=5,b=6;/ /定义变量和初始化
int*p1=&a, *p2=&b;/ /定义指针变量和初使化
p2=p1;/ /把a的地址赋予指针变量p2
*p2= *p1;/ /把p1指向的内容赋给p2所指的区域(同类型之间可以这么做)

数组赋值:(把数组的首地址,赋予指向数组的指针变量)

int a[2] ;*p;//声明

p=a;//数组名表示数组的首地址

指针变量的引用

有两个主角 分别是   &  和 *

&   取地址运算符    

取地址运算符用于取变量的地址,取地址运算符是单目运算符。

一般形式  &变量名   含义:获得变量在内存中的实际地址

*  取内容运算符

  取内容运算符用来表示指针变量所指向内存中的数据内容

一般形式  *变量名   含义:获得指针变量所指向单片机内存地址中的实际数值

void main()
{
   int x =1,y,*p=x;//指针变量p    *p等价于x
     y = *p +21;      //表示把x的内容加上21给y   ,y=22
     }

我不理解的地方:为啥  y=*p++;  //相当于y = x ;x++;

有哪位大神可以解答下,评论区可以留言解惑,感谢感谢

最后想说下指针数组

指针数组

指针数组   类型标识符 *数组名[整型常量表达式]

char  *ch[10];

规则如下:

 ch 为指针数组元素的首地址

ch+i 为指针数组的第i个元素的地址

*ch 等价于ch[0]   ,指针数组的第一个元素

*(ch+i)  等价于ch[i]  ,为数组的第i个元素

如果有什么错误,希望各位大神能指出来,共同学习,一起进步


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机C语言基础知识-指针篇 的相关文章

随机推荐

  • 微信企业付款至零钱,状态处理中,status=PROCESSING的解决办法

    前段时间腾讯因为支付系统异常 更新了一些东西 然后就开始出现了这个问题 时不时的就会有一个两个状态为 处理中 的交易 但文档中并没有给出解决办法 尝试咨询了客服 给出了两个解决方案 1 把该笔交易当做失败处理 但以后这笔订单就不要再去折腾它
  • ESP8266 RTOS SDK 移植 u8g2 移植代码

    LED屏驱动ssd1306 屏幕128x64大小 1 移植代码核心 方法1 port c define SCL Pin GPIO SCL define SDA Pin GPIO SDA void delay us uint32 t time
  • Flink学习20:算子介绍reduce

    1 reduce简介 按照指定的方式 把每个元素进行累计执行 比如实现累加计算 示例 import keyByNameTest StockPrice import org apache flink api scala createTypeI
  • C++ 类学习总结(三) 类的拷贝赋值操作

    拷贝赋值操作 基本概念 拷贝构造函数 是一种构造函数 用同类型的对象初始化本对象的操作 即将新对象初始化为同类型另一个对象的副本 拷贝赋值运算符 接收一个本类型对象的赋值运算符版本 返回本对象的引用 类的默认函数 默认合成函数 当我们定义了
  • STM32F103 实验 PWM输出

    目录 本文 在上一章的基础上 将介绍如下内容 PWM输出实验 上一篇 STM32F103实验定时器 https blog csdn net qq 40318498 article details 96436994 正文 实验目的 使用TIM
  • Bridge:桥接模式

    将抽象部分与它的实现分离 使他们都可以独立地变化 抽象与实现的分离方法 是借助耦合 对于一个派生类而言 其从基类继承了抽象函数 并对抽象函数进行实现 这是常规的抽象与实现耦合的情况 而 若将函数实现的功能代码抽出 放到一个特定的实现类里 并
  • 设计模式(适配器模式)

    这里写目录标题 一 应用 1 1 概念 1 2 应用场景 二 实现 2 1 Python实现 2 2 Java实现 2 3 Golang实现 一 应用 1 1 概念 适配器是一种结构化的设计模式 主要是为了让不兼容的对象能够相互兼容 1 2
  • shell脚本——循环语句、sed、函数、数组、免交互expect

    目录 循环语句 for while 与 until sed 基本用法 sed脚本格式 函数 注意事项 定义函数和调用函数 脚本中函数的位置 查看函数 删除函数 函数返回值 函数的传参操作 使用函数文件 递归函数 数组 声明数组 数组切片 免
  • 记录 BL-604 环境配置

    与两个朋友组队参加个比赛 第一次正经的参加比赛 弥补之前一些遗憾吧 随便记录一下 下载博流的开发包 https gitee com bouffalolab bl mcu sdk 注册平头哥 https occ t head cn auth
  • NandFlash介绍、操作流程分析以及S5PV210的NandFlash控制器介绍

    1 NandFlash的型号与命名 注 本文以S5PV210芯片和K9F2G08芯片做分析 1 Nand的型号命名都有含义 拿K9F2G08来示例分析一下 K9F表示是三星公司的NandFlash系列 2G表示Nand的大小是2Gbit 2
  • Tomcat 各安装包选择及使用情景。

    本文参考 Apache Tomcat 8 5 51 官方 README 文件 当我们进入 Tomcat 主页下载 Tomcat 时 会看到各种安装包的选择 Binary Distributions 二进制发行包 Core zip pgp s
  • QT/C++ 多线程时,工作界面的样式频繁改变导致程序奔溃的问题

    QT C 多线程时 工作界面的样式频繁改变导致程序奔溃的问题 一 错误现象与原因 最近在学习QT 遇到了一点问题 是关于工作线程与UI线程的 其主要问题为 我的工作线程是一个死循环 当我点击按钮进入工作线程 我的工作线程用emit发送一个信
  • IDEA使用JUnit时@Test无效以及无法导入org.junit包的一系列问题

    先找到idea的安装位置 进入lib文件夹 然后打开idea File gt Project Structure 选择Project Settings中的Libraries 点击如图 号 然后添加以下两个包 点击OK 添加成功就可以了 ht
  • 3.java 基础if语句测评题-答案

    知识点 java 基础if语句测评题 答案 题目1 训练 李雷想买一个价值7988元的新手机 她的旧手机在二手市场能卖1500元 而手机专卖店推出以旧换新的优惠 把她的旧手机交给店家 新手机就能够打8折优惠 为了更省钱 李雷要不要以旧换新
  • SQL-更新和删除数据

    如何使用UPDATE和DELETE语句进一步操作表数据 1 更新数据 更新 修改 表中的数据 使用UPDATE语句 更新表中的特定行 更新表中的所有行 注 不要省略WHERE子句 在使用UPDATE时一定要细心 因为稍微不注意 就会更新表中
  • ArcGIS教程:面积制表

    摘要 计算两个数据集之间交叉制表的区域并输出表 插图 使用方法 区域定义为输入中具有同样值的全部区 各区无需相连 栅格和要素数据集都可用于区域输入 假设区域输入和类输入均为具有同样分辨率的栅格 则可直接使用它们 假设分辨率不同 则可先应用内
  • AT指令(中文详解版)

    AT命令最常见的应用场景 1 智能手机 一般智能手机都是一个主芯片控制一个通信模块 这个通信模块就是一个完整的 简单的手机 包括手机应该有的射频 基带等部分 还有GSM协议栈 完全可以独立打电话 发短信 用GPRS上网等 主芯片实现复杂的应
  • 【GD32篇】新建KEIL工程

    以GD32f103C8T6芯片为例 一 下载MDK5 软件包 下载地址 https www keil com dd2 pack 1 选择工程所需的软件包 2 打开软件包 安装在KEIL5同路径下 3 安装成功后打开keil软件 可查看到自己
  • 经典Hive-SQL面试题及答案

    目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017 1 21 5 u02 20
  • 单片机C语言基础知识-指针篇

    引言 指针是变量在计算机或单片机内所占有的存储区域的地址 C51语言中广泛使用的指针概念是从C语言中继承下来的 利用指针变量不但可以操作各种基本的数据类型 而且能使C51语言像汇编语言一样 具有处理单片机内存地址的能力 地址 指针 指针变量