一文扒开C语言指针神秘的外衣,指针也不过如此嘛

开发 后端
指针是 C 语言的灵魂,指针可以直接操作内存,指针使C程序更加高效,等等等等。相信 C 语言初学者学到指针时,会看到很多这样描述指针的话,但是却往往一头雾水。所以,本节不会一上来就直接说指针,但是相信我,看完本节,你一定会觉得 C 语言的指针也不过如此,没那么神秘。

指针是 C 语言的灵魂,指针可以直接操作内存,指针使C程序更加高效,等等等等。相信 C 语言初学者学到指针时,会看到很多这样描述指针的话,但是却往往一头雾水。所以,本节不会一上来就直接说指针,但是相信我,看完本节,你一定会觉得 C 语言的指针也不过如此,没那么神秘。

[[253871]]

上一节介绍了 C 语言中的数据类型,提到不同的数据类型的主要区别在于占用的存储空间不同。我们知道,C 程序是运行在计算机的内存中的,因此 C 程序的变量也是存在于内存中的。C 标准规定 char 类型占用一个字节的存储空间,对其他整型却没有做规定,现在为了解释的方便,我们假设 int 类型的数据占用内存 4 个字节。

假设我们如下定义了两个变量: 

  1. signed char i = 3 
  2. int j = 8

那么,i 占用了 1 字节的内存空间,j 占用了 4 字节的内存空间,请看下图。

方框表示内存空间,内部表示存储的值。我们把内存逐字节编号,方框外部的数字表示方框的编号(这样的内存“编号”即所谓的“内存地址”)。修改变量 i 的值,实际上就是修改地址为 4000 的内存空间里的值。那反过来呢?如果我修改了地址为 4000 的内存空间里的值,i 的值会相应改变吗?答案是肯定的,请继续往下看。

上图中的内存地址“4000”是我为了解释方便随意取的。那么,在实际应用中,变量 i 的地址如何获取呢?C 语言提供了“&”运算符,就是获取变量地址的。请看下面的例子: 

  1. #include <stdio.h>  
  2. int main()  
  3.  
  4.  signed char i = 3 
  5.  int j = 8 
  6.  long p1 = (long)&i;  
  7.  printf("p1: %ld  
  8. ", p1);  
  9.  return 0;  

我们取出了 i 的地址,把它强制转换为 long 型(关于强制类型转换,可参考上一节),传递给 p1 了。编译执行,发现变量 i 的地址被打印出来了。这说明,C 程序变量的地址也是一个整数。

按照上面的说法,修改 i 的值除了直接对 i 赋值以外,还可以通过修改 p1 地址处的内存空间里的数值。那,怎样才能“通过修改 p1 地址处的内存空间里的数值”修改 i 的值呢?

上面的代码实例中,我们使用了 long 型变量 p1 存储了 i 的地址。事实上,C 语言有专门的数据类型存储地址,定义方式也很简单,就是:“类型描述符 * ”,例如,可以定义以下变量存储地址: 

  1. signed char *p1 = &i;  
  2. int *p2 = &j; 

p1 和 p2 就是 C 语言中所谓的指针类型,因为 i 是 signed char 类型的,所以定义了 signed char * 类型的指针存储 i 的地址。j 是 int 类型的,所以定义了 int * 类型的指针存储 j 的地址。另外,C 语言提供了“&”运算符取变量地址,与之对应的,还提供了“ * ”运算符从相应地址内存里取出数值。

[[253874]]

好了,了解了 C 语言的指针类型和“ * ”运算符,现在来看看如何“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。请看如下代码: 

  1. signed char *p1 = &i;  
  2. *p1 = 5 
  3. printf("i=%d  
  4. ", i); 

编译运行,发现程序输出“i=5”,这样我们就实现了“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。

在定义变量时,” * “放在变量符号前,可以定义指针变量。在定义完指针变量后,“ * ”放在变量前,就表示从地址取值的运算符了。另外,“ * ”还可以表示乘法运算符,读者自己思考什么情况下,“ * ”表示乘法运算符。

以上的操作,实际上就是 C 语言的指针操作,可以看出它一点也不神秘,接下来几节,我们将继续讨论 C 语言的指针,比如为什么 int 类型的变量 j 的地址要使用 int* p2; 定义,而不能使用 signed char* p2; 定义,使用指针为何能写出紧凑、高效的 C 程序等等。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言,喜欢我的文章就关注一波吧,可以看到***更新和之前的文章哦。 

责任编辑:庞桂玉 来源: 今日头条
相关推荐

2024-02-01 11:57:31

this指针代码C++

2021-09-09 17:05:36

C++智能指针语言

2023-07-04 08:56:07

指针类型Golang

2020-12-29 08:02:37

SqlSession 程序Executor

2021-01-13 06:58:35

C语言函数指针

2020-05-21 08:24:17

阿里SQL查询

2011-07-15 01:20:58

C指针函数函数指针

2021-02-18 15:43:37

Python装饰器Decorator

2022-01-06 14:25:24

C语言指针内存

2009-06-30 10:46:05

多级指针

2023-10-27 11:21:20

C语言Multics语言

2021-12-06 11:19:47

语言指针内存

2020-09-23 16:55:43

C语言编程语言

2009-01-08 09:26:06

C语言指针类型

2018-06-05 11:18:18

2014-08-01 15:16:05

SwiftC语言

2021-08-06 13:48:53

C语言野指针内存

2024-11-11 16:36:41

2021-08-11 09:01:48

智能指针Box

2021-07-29 06:09:05

万能指针C语言void
点赞
收藏

51CTO技术栈公众号