关于C语言中指针的理解

在学STM32时发现如果对C语言指针没有完全理解会对学习造成很多困扰,查了很多资料,觉得C语言中文网讲的比较透彻,原文链接。我觉得产生困惑的原因就是对符号“ * ”在指针中什么时候使用以及起到的作用不了解造成的,个人整理如下:

1、指针的通俗理解

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量

如下图现在假设有一个指针变量 p ,指针变量 p 自身的地址为0x22B , 指针变量 p 的值为 0x11A,正好和另一个一个char 类型的变量 c的地址一样,此时我们称 p 指向了 c,或者说 p 是指向变量 c 的指针。

char c='k'
char *p

关于C语言中指针的理解_第1张图片

2、关于‘ * ’的使用

2.1 利用‘ * ’定义指针变量

定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号 * ,此时 *是一个特殊符号,表明一个变量是指针变量,且该指针变量所指向的数据的类型分别为 float 类型和 char 类型。指针变量p1,p2自身存储的值则是其指向数据的地址。p1、p2 的类型分别是float*char*,而不是floatchar。

//定义普通变量
float a = 99.5;
char b = '@';
//定义指针变量p1并完成赋值
float *p1 = &a;
先定义指针变量p2,后单独完成赋值
char *p2;
p2 = &b;

定义好指针变量 p1、p2 后给他们赋值时,因为已经知道了他们是指针变量,就没必要多此一举再带上*,后边可以像使用普通变量一样来使用指针变量。观察上述代码中对指针变量 p1、p2完成定义和赋值的两种等价方式可以明确知道,定义指针变量时必须带*,给指针变量赋值时不能带*

 

2.2 指针运算符‘ *

除开定义指针型变量外,‘ * ’常用作指针运算符使用。指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据。如:

#include 
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 
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,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。
 

所以,*在不同的场景下有不同的作用:*可以用在指针变量的定义中,表明这是一个指针变量,以和普通变量区分开;使用指针变量时在前面加*表示获取指针指向的数据,或者说表示的是指针指向的数据本身。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(c语言)