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

本文详细介绍了C51语言中的指针概念,包括地址、指针和指针变量的区分。指针变量用于存储内存地址,通过取地址运算符`&`获取变量地址,而`*`用于访问指针所指向的值。文章还讨论了指针变量的声明、赋值、引用,并给出了数组和函数指针的应用示例。同时,提到了错误的指针赋值情况以及指针数组的定义和使用。通过指针,程序可以实现更高效的内存访问和操作,但也增加了程序的复杂性。
摘要由CSDN通过智能技术生成

引言:指针是变量在计算机或单片机内所占有的存储区域的地址。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个元素

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨小羽ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值