C语言中的指针以及二级指针代码详解

  

很多初学者都对C中的指针很迷糊,希望这篇博客能帮助到大家:

  

1。什么是“指针”:

  

在执行C程序的时候,由于我们的数据是存储在内存中的。所以对于C程序本身来说,如果想找到相应被调用的数据,就要知道存储该数据的内存地址是多少,换言之,C程序通过已知的内存地址到相应的内存位置存储数据。

  

这里简单说一下内存管理(对于初学者来说。为了避免专业术语引发的理解问题,下面的叙述尽量避免专业定义:),对于现代计算机系统来说,内存空间分为两个区域,一个是“数据区”,一个是“地址区”,“数据区“存储的是用户数据,比如我们要把一个数字“5”存储到计算机(因为一个单纯的自然数“5”,是没有任何意义的,然后对于计算机来说它需要知道你要把什么定义为“5”,你就不得不定义“x=5”)对于计算机而言,这个过程分为以下几个部分:

  

1。在“栈区(栈)(这个定义实在不能避免,初学者的话就请暂时记住这个名字)”开辟一个空间,用来存放“5”

  

2。另存存放“5”的内存的地址。

  

3。将步骤2中的内存地址存在另一个区域(专门用来存放地址的指针区),并记下当前存放步骤2中的内存地址的内存地址(好拗口,这里其实是二级指针的概念)

  

3。建立一个“索引”将x与步骤3中的内存地址关联,存放在“索引区”(请注意,x和5不是存在一起的,而是有一个“映射表”,并且指向x的指针不会直接指向5,而是直接指向x,再通过“映射表“找到x的值“5”,这个概念非常重要,后面例子会讲到利用指针交换两个变量的值,就是基于“x和5不是存在一起的“这个基本概念)。

  

这里再多说一嘴:为什么要以这种方式存放数据?

  

内存的存储区就像一池湖的水,数据就像池水里面的鱼,如果不用内存寻址的方式,那么当你找某个特定数据的时候,就相当于在一池湖水里找某一条叫做“张三”的鱼一样,你得一条一条捞出来辨认。

  

如果有内存寻址,就像把一池湖水用渔网分成若干网格,每个网格里面放一两条鱼并且把每个网格都编号(编号和鱼的对应关系假如你用一个小本子记起来),这样当你想找某条叫“张三”的鱼时,你只要打开小本子(指针地址)找相应的网格就可以了。

  

那么,存储数据的内存地址(有点拗口)或者说是上面例子里面记载编号和鱼的对应关系的小本子就叫指针。

  

举个实例吧,如下图所示,我们将内存存储空间实体化:假设途中两条平行线夹的空间是内存可以存储数据的空间,途中C的位置存储的是数据,那么p的位置存储的就是指针。

  

 C语言中的指针以及二级指针代码详解

  

如何定义指针?

  

int * p;

  

注意:   

1。这里的int,指的是指针p对应的存储区的数据格式,并不是指针p的数据格式。你可以理解为指针的数据格式只有一种。

  

2。*不仅仅是单纯的运算符,它还是声明符。可以把“*”理解为像“整数、浮点数、双”等等这样的格式声明。

  

3。在使用指针p的时候,经常会用到地址运算符“,”,请注意”,“是运算符,运算操作是取地址,可以把p直接赋上一个地址值:

        int i=5 * p;   p=,我;之前      

于是* p的值就是5了。

  

上面还可以这么写

        int i=5;   int * p=,我;之前      

从这两个例子的区别可以看出“*”具有类型声明的作用。

  

再写一个交换两个变量的值的代码:

        # include & lt; stdio.h>      无效的交换(int *, int * b)   {   int临时;//创建一个中间变量用于交换位置。   temp=*;   *=* b;   * b=temp;   }      int main ()   {   int m=10, n=22;   交换(,m, n);//这里对于理解内存管理原则非常重要,正如前面所说,变量米和其值10不是存在一个内存存储区,而是两个,它们通过一个映射表映射起来,所以在这里交换m和n的地址值可以理解为交换了m和n的映射表指向位置。   printf (" m=% d n=% d \ n”, m, n);      返回1;         }      

上面是通过改变两个变量地址的方式交换了变量m, n的值。在这个过程用到了内存地址和内存以及指针的定义,如果没有看懂请回头再仔细研究指针的定义。

C语言中的指针以及二级指针代码详解