c语言入门20,一文扒开C语言指针神秘的外衣,终于明白了
发表于: 2018-11-16 08:00:28 | 已被阅读: 37 | 分类于: C语言
指针是 C 语言的灵魂,指针可以直接操作内存,指针使C程序更加高效,等等等等。相信 C 语言初学者学到指针时,会看到很多这样描述指针的话,但是却往往一头雾水。所以,本节不会一上来就直接说指针,但是相信我,看完本节,你一定会觉得 C 语言的指针也不过如此,没那么神秘。
假设我们如下定义了两个变量:
signed char i = 3;
int j = 8;
那么,i 占用了 1 字节的内存空间,j 占用了 4 字节的内存空间,请看下图。
上图中的内存地址“4000”是我为了解释方便随意取的。那么,在实际应用中,变量 i 的地址如何获取呢?C 语言提供了“&”运算符,就是获取变量地址的。请看下面的例子:
#include <stdio.h>
int main()
{
signed char i = 3;
int j = 8;
long p1 = (long)&i;
printf("p1: %ld\n", p1);
return 0;
}
按照上面的说法,修改 i 的值除了直接对 i 赋值以外,还可以通过修改 p1 地址处的内存空间里的数值。那,怎样才能“通过修改 p1 地址处的内存空间里的数值”修改 i 的值呢?
上面的代码实例中,我们使用了 long 型变量 p1 存储了 i 的地址。事实上,C 语言有专门的数据类型存储地址,定义方式也很简单,就是:
signed char *p1 = &i;
int *p2 = &j;
好了,了解了 C 语言的指针类型和“ * ”运算符,现在来看看如何“通过修改 p1 地址处的内存空间里的数值”修改 i 的值。请看如下代码:
signed char *p1 = &i;
*p1 = 5;
printf("i=%d\n", i);
在定义变量时," * "放在变量符号前,可以定义指针变量。在定义完指针变量后,“ * ”放在变量前,就表示从地址取值的运算符了。另外,“ * ”还可以表示乘法运算符,读者自己思考什么情况下,“ * ”表示乘法运算符。
以上的操作,实际上就是 C 语言的