在学STM32时发现如果对C语言指针没有完全理解会对学习造成很多困扰,查了很多资料,觉得C语言中文网讲的比较透彻,原文链接。我觉得产生困惑的原因就是对符号“ *
”在指针中什么时候使用以及起到的作用不了解造成的,个人整理如下:
1、指针的通俗理解
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
如下图现在假设有一个指针变量 p ,指针变量 p 自身的地址为0x22B , 指针变量 p 的值为 0x11A,正好和另一个一个char 类型的变量 c的地址一样,此时我们称 p 指向了 c,或者说 p 是指向变量 c 的指针。
char c='k'
char *p
2、关于‘ *
’的使用
2.1 利用‘ *
’定义指针变量
定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号 * ,
此时 *
是一个特殊符号,表明一个变量是指针变量,且该指针变量所指向的数据的类型分别为 float 类型和 char 类型。指针变量p1,p2自身存储的值则是其指向数据的地址。p1、p2 的类型分别是float*
和char*
,而不是float
和char。
//定义普通变量
float a = 99.5;
char b = '@';
//定义指针变量p1并完成赋值
float *p1 = &a;
先定义指针变量p2,后单独完成赋值
char *p2;
p2 = &b;
定义好指针变量 p1、p2 后给他们赋值时,因为已经知道了他们是指针变量,就没必要多此一举再带上*
,后边可以像使用普通变量一样来使用指针变量。观察上述代码中对指针变量 p1、p2完成定义和赋值的两种等价方式可以明确知道,定义指针变量时必须带*
,给指针变量赋值时不能带*
。
2.2 指针运算符‘ *
’
除开定义指针型变量外,‘ *
’常用作指针运算符使用。指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据。如:
#include <stdio.h>
int main(){
int a = 15;
//定义指向a的指针型变量P
int *p = &a;
//定义完P后,*就作为指针运算符,用于取得地址a上存储的数据15
printf("%d, %d\n", a, *p); //两种方式都可以输出a的值
return 0;
}
运行结果:
15, 15
也就是所当完成指针变量的定义和,利用指针运算符‘ *
’可以实现 *p 和 a 的等价。指针除了可以获取内存上的数据,也可以修改内存上的数据,例如:
#include <stdio.h>
int main(){
int a = 15, b = 99, c = 222;
int *p = &a; //定义指针变量
*p = b; //通过指针变量修改内存上的数据
c = *p; //通过指针变量获取内存上的数据
printf("%d, %d, %d, %d\n", a, b, c, *p);
return 0;
}
运行结果:
99, 99, 99, 99
*p 代表的是 a 中的数据,它等价于 a,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。
所以,*
在不同的场景下有不同的作用:*
可以用在指针变量的定义中,表明这是一个指针变量,以和普通变量区分开;使用指针变量时在前面加*
表示获取指针指向的数据,或者说表示的是指针指向的数据本身。