当前位置: 首页 > 科技观察

这篇文章剥去了C语言指针的神秘外衣,指针仅此而已

时间:2023-03-19 23:54:28 科技观察

指针是C语言的灵魂。相信C语言初学者在学习指针的时候,会看到很多这样描述指针的词,但往往会一头雾水。所以,这一节不会一上来就直接说指针,但是相信我,看完这一节,你一定会觉得C语言中的指针也不过如此,没有那么神秘。上一节介绍了C语言中的数据类型,提到了不同数据类型的主要区别在于它们占用的存储空间不同。我们知道C程序运行在计算机的内存中,所以C程序的变量也存在于内存中。C标准规定char类型占用一个字节的存储空间,但对其他整型没有规定。现在为了方便说明,我们假设int类型的数据占用4个字节的内存。假设我们定义两个变量如下:signedchari=3;intj=8;那么,i占用1字节的内存空间,j占用4字节的内存空间,请看下图。盒子代表记忆空间,内部代表存储的价值。我们对内存逐字节编号,方框外的数字代表方框的编号(这样的内存“编号”就是所谓的“内存地址”)。修改变量i的值,其实就是修改地址为4000的内存空间中的值,反过来呢?如果我修改地址为4000的内存空间中的值,那么i的值会不会随之改变呢?答案是肯定的,请继续阅读。上图中的内存地址“4000”是我为了方便说明而随便取的。那么,在实际应用中,如何获取变量i的地址呢?C语言提供了“&”运算符,就是获取变量的地址。请看下面的例子:#includeintmain(){signedchari=3;intj=8;longp1=(long)&i;printf("p1:%ld",p1);return0;}我们取出来了i的地址转换为long类型(类型转换请参考上一节),传递给p1。编译执行,发现打印出了变量i的地址。这表明C程序变量的地址也是一个整数。根据上面的说法,修改i的值除了可以直接给i赋值外,还可以修改p1地址处内存空间中的值。那么,如何才能“通过修改p1地址的内存空间中的值”来修改i的值呢?在上面的代码示例中,我们使用long变量p1来存储i的地址。其实C语言有专门的数据类型存储地址,定义方法也很简单,就是:“类型描述符*”,例如可以定义如下变量存储地址:signedchar*p1=&i;int*p2=&j;p1和p2在C语言中就是所谓的指针类型。由于i是signedchar类型,所以定义了一个signedchar*类型的指针来存放i的地址。j是int类型的,所以定义了一个int*类型的指针来存放j的地址。另外,C语言提供了“&”运算符来获取变量的地址,相应地,也提供了“*”运算符来从相应地址内存中获取值。好了,知道了指针类型和C语言中的“*”运算符之后,我们就来看看如何“通过修改p1地址的内存空间中的值”来修改i的值。请看下面的代码:signedchar*p1=&i;*p1=5;printf("i=%d",i);编译运行,发现程序输出“i=5”,这样我们就实现了“通过修改p1处的内存空间中的值”来修改i的值。定义变量时,在变量符号前加“*”,定义指针变量。定义好指针变量后,在变量前面加上“*”,表示从地址取值的运算符。此外,“*”还可以表示乘法运算符。读者可以想一想“*”代表乘法运算符的情况。以上操作实际上是C语言中的指针操作。可见一点都不神秘。在接下来的几节中,我们会继续讨论C语言中的指针,比如int类型的变量j的地址为什么要使用int*p2;定义而不是使用signedchar*p2;定义,为什么使用指针可以写出简洁高效的C程序等等。欢迎在评论区一起讨论和提问。文章均为手写原创,每天用最浅显的方式介绍C语言。如果喜欢我的文章,请关注。你可以看到***更新和以前的文章。