本来都块写完了一篇文章, 结果草稿丢了,我去~~~
不过刚好,重新把指针这部分总结一遍。
通常大家都讲,指针是C语言的灵魂。虽然我也搞不懂为什么称之为灵魂,但是日常工作中,确实能够接触到这部分内容,为了能够在工作中灵活的进行一番运用,只能先把这块搞懂,搞清楚,抓住重点,后面如果有更深奥洗脑的知识点,就可以在此基础上旁征博引,融会贯通。
我个人觉得这块比较重要的知识点主要有以下几个部分:
第一点:弄清楚变量和指针的区别:
如图所示:
整型变量:
int a =10;
定义1个整型变量a,a的值为10;a的地址为0x00102BBF;
指针变量:
int* p ; //定义1个指针变量p; int* 表示这个指针变量指向1个整型变量的地址
p=&a; //p的存储内容为变量a的地址;(&为取地址符)
定义1个指针变量p,p的值为0x00102BBF(也就是a的地址) p的地址为0xXXX(先不care);
因为变量p当初存储的是a的地址,所以我们称变量p指向a;
好,基于此我们知道:
a为整型变量,p为指针变量; 且p指向a;
————————————————————————
第二点 弄清两个符号 :“ * ” 和“ & ”
我们还需要弄清楚取值符和取地址符?怎么办呢?反复的验证即可;我理解这个感觉就像是英语语法一样。反复的去辨认磨练,就可以完全记住,理解通透;(遇到了就不放过,弄清楚就可以)
下面搞一堆代码,一起理解理解:
//number one
#include <stdio.h>
int main()
{
int *p; //定义1个指针变量p;没有具体给映射地址,所以仅仅是告诉大家这是定义1个指针,并且指向整型变量;
int i=3; //定义1个整型变量;它的值为3;
p=&i; //我们看,p前面没有前缀,代表直接对变量操作; &i代表取出i的地址, 所以就是取出i的地址作为p的值; -->也就是p指向了i;
return 0;
}
//number two
int main()
{
int i=3; //定义1个整型变量;它的值为3;
int j; //定义1个整型变量;未附初始值;
int *p=&i; //左边是取值符,右边是取地址符,所以其含义应该是取出i的地址,作为p的值; (这里指针变量的定义和赋值其实是放到一起了,也就是定义1个指针变量p。其值为变量i的地址;)
j=*p; //右边是取值符,也就是说,取出指针变量p指向变量的值,并赋值给j;
printf("i=%d,j=%d",i,j);
}
总结一下:
p保存了i的地址,因此p指向i
p不是i,i也不是p
修改p的值不影响i的值(可能指向了另一个变量),修改i的值也不影响p的值(i的值变化,但是存储地址没有变;)
如果一个指针变量指向了某个普通变量,则 *指针变量=普通变量 同时 指针变量=&普通变量; 即
*p =i;// 取值符; *p就是以p的内容为地址的变量
p=&i;//取地址符;
第三点 指针的本质
弄清楚了语法的运用,再结合其本质理解一下:
1.什么是指针?
指针就是地址,地址就是指针。
地址:内存单元的编号 ,从零开始的非负整数; 地址一般会使用1个机器字进行存储,其大小一般为:
1个字节(8位单片机);
2个字节(16位单片机);
4个字节(32位单片机);
8个字节(64位单片机);
指针的本质就是一个操作受限的非负整数,两个指针之间只能进行减法运算,不能进行乘除加法运算
2.指针和指针变量的区分
指针就是地址,地址就是指针;
指针变量就是存放地址的变量;
指针和指针变量是两个不同的概念,但是通常我们叙述时,会把指针变量简称为指针(无所谓)
3.指针的作用
用来表示一些复杂的数据结构
快速传递数据
使函数返回一个以上的值
能直接访问硬件 (这个是重点,,实际工作中,经常需要对单片机的某块内存地址直接进行操作;会用到指针;保密原因就不举例了)
能够方便地处理字符串
是理解面向对象语言中引用的基础
以上就是本文主要内容,欢迎共同探讨,共同进步。
加油!生活就是不断向前!