引言:指针是变量在计算机或单片机内所占有的存储区域的地址。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个元素
如果有什么错误,希望各位大神能指出来,共同学习,一起进步