龙空技术网

C语言的指针

大不不 168

前言:

当前我们对“c语言的指针”大约比较着重,大家都想要剖析一些“c语言的指针”的相关内容。那么小编在网上网罗了一些对于“c语言的指针””的相关知识,希望咱们能喜欢,兄弟们快快来学习一下吧!

今天我们来介绍一下C语言中非常有趣的部分:指针(pointer)。指针是C语言提供的一种非常有趣又有用的特性,没有指针,就没法动态分配内存,无法进行函数的回调,很多高级的编程技巧都无法达成。所以指针是C语言学习中非常重要的内容。江湖上总有传言指针复杂难学,但其实它真的很简单,啥?不信!不信咱就骑驴看唱本-走着瞧呗,嘿嘿~

指针是个啥?

在正式介绍指针之前,我们先来回顾一下C语言程序的数据是如何存放的。先来看一段代码

#include <stdio.h>int main(){    int ivar = 10; // 声明一个整数型变量,名称为"ivar",其值是10    return 0;}

上面的代码中,我们声明了一个整数型的变量ivar 并给它赋值为10。如果我们把变量看成是可以装入数据的小盒子,那么现在我们就制造了一个小盒子,给它贴上了个名字“ivar”,然后在里面放上了数据:整数10。

以上变量和数据在内存中是如何存放的呢?我们知道,所谓程序是由计算机(更准确点说是操作系统)加载其进内存后执行的,计算机会为程序分配一个内存空间用来存放程序编译后的代码指令以及程序中用到的数据。对于上面这段程序,计算机会在内存中分配一个内存空间用来存放整数(一般是4字节长度),并给这个空间起个名字叫“ivar”。当我们给`ivar`赋值的时候,所赋的值就存入到这个内存空间中。这就是变量和变量的数据在内存中实际存放的形态。

因为内存是有编号的,所以我们在示意图上加上内存的编号

内存编号我们也称之为内存地址,通常使用一个16进制的整数来表示。比如上面例子中的内存地址就是16进制整数61fe14

既然内存地址也是个整数,那么如果有个小盒子(变量)存放这个内存地址,那我们就可以随时通过这个小盒子里的地址找到相应的内存块,取得里面的数据或是改变里面的数据了。这个用来存放内存地址的变量我们称之为指针

如上图所示,我们用一个变量`pvar`保存变量`ivar`的内存地址`0x61fe14`,则变量`pvar`就是一个指针,准确得说是一个指针变量

我们知道了什么是指针,那怎么用代码实现呢?来,上代码

#include <stdio.h>int main(){    int ivar = 10;    int *pvar;     pvar = &ivar;    printf("pvar存储的内存地址是:%p\npvar指向的内存中的值是:%d\n", pvar, *pvar);    return 0;}

编译运行上面的代码,我们将得到类似下面的结果

pvar存储的内存地址是:000000000061FE14pvar指向的内存中的值是:10

代码中有一行特别的变量声明:

int *pvar;

这里就是声明一个能指向整数的指针变量,变量名是pvar

 pvar = &ivar;

这行代码意思是将变量`ivar`的内存地址取到,赋值给指针变量`pvar`。符号**`&`**在这里是**取地址运算符**,即将变量`ivar`所对应的内存地址取出来。

当我们想要通过指针操作它指向的内存块中的数据时,要怎么做呢?来看这一行代码

printf("pvar存储的内存地址是:%p\npvar指向的内存中的值是:%d\n", pvar, *pvar);

没错,我们又使用了符号`*`,这次`*`充当了间接运算符的角色,和指针变量结合起来就相当于得到了指针变量所指向的内存块的操作权,`*pvar`可以取得`pvar`所指向内存块中的值。那有同学要问了:是不是只能取值?如果我想改变指针指向内存块中的值要怎么做呢?很简单,还是利用间接操作符`*`来完成,像这样:

*pvar = 20;

这样就可以将pvar所指向的内存块中的值修改成20了。发现没有,因为pvar是指向变量ivar的地址的,我们可以将*pvar等同ivar。对*pvar的操作效果与直接操作变量ivar是一样的。

以上,就是指针最基础的概念和操作啦!是不是很简单?不过如同围棋一样,往往规则越是简单,变化越是多端。指针本身不复杂,但江湖上流传着许多指针的武林秘籍,招式多变,威力惊人!在后面的学习中,我们将逐步提升功力,将指针高级招式悉数掌握,方能在C语言的江湖上游走自如,成为一代大侠!

标签: #c语言的指针