间接赋值0级指针到一级指针

  很多人估计对于指针还是不清楚,那么就来看看一级指针的间接赋值是是如何实现的:

  指针是用来干什么的;操作内存块 ,说白点就是赋值,所以间接赋值就是指针重要的特性之一

  这里说明一下指针操作的内存块是变量本身的内存块,而并非是为指针新开辟了内存空间;

  这么说估计还是有些模糊;那么还是通过代码来说明吧!

  

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

  void ChangeArray(int *b)
  {
    *b = 40;//b 是a 的地址 *b通过地址间接修改a的值
  }

  int ChangeArray2()
  {
    int a = 0;
    a = 50;
    return a;
  }

  void ChangeArray3(int a)
  {
    a = 40;
  }

  int main()
  {
    int    a = 0;//建立一个int型变量,欲改变它的值并打印出来
    int    *b = NULL;

    //1.直接改变
    a = 10;
    printf("a = %d\n",a);//a = 10

    //2.间接改变
    b = &a;//将地址赋给指针
    *b = 100;//* 就像一把钥匙 通过地址找到内存空间 间接改变了变量的值
    printf("a = %d\n",a);//a = 100

    //到此时大部分人都能理解
    //那么接下来我们进行函数调用
    //通过函数进行改变

    {
      *b = 200;
      printf("a = %d\n",a);//a = 200
    }//这样也可以改变变量的值,那么接下来我们将它们运用到函数中

    ChangeArray(&a);
    printf("a = %d\n",a);// a = 40
  //此时我们发现可以通过指针在子函数中也可以改变变量

    //这时有人会说可以通过return 改变
    a = ChangeArray2();
    printf("a = %d\n",a);//a = 50
    //但是这种做法只能返回一个值,倘若要返回多个值是做不到的;
    //当然我们可以通过返回结构体来返回多个数值
    //可是这样的话编译器就会重行开辟空间,重新进行赋值,就会拖慢运行速度;而指针就是为了解决这个问题才出现的不是么?

    //当然这个时候肯定会有人认为可以通过形参改变数值
    ChangeArray3(a);
    printf("a = %d\n",a);//这是a 仍然是上次运行的结果 a = 50
    //我们发现这样是无法直接改变数值的  

    system("pause");
    return 0;
  }

 

 

  现在我们来分析这段代码是如何运行的;首先运行main函数;在栈区为a和b分配内存空间

  当运行到ChangeArray*(&a)时,将a的地址传递给了子函数的指针,此时栈区为子函数开辟空间,int *b入栈,*b = 40;,证如同注释一样,b 是a 的地址 *b通过地址间接修改a的值,也可以这样理解 * 就像一把钥匙 通过地址找到内存空间 间接改变了变量的值;此时指针指向的地址是main函数中a的地址;它直接修改了a,运行完毕之后函数被析构掉,子函数中的int *b也被析构掉,但是main中的a值已经改变;

  当运行到ChangeArray2()时,这个我想不用解释了,想必大家都看的懂,可能有人会问,返回的值不是被析构掉了么?因为通过return返回值,所以这个数值会被暂时的储存在寄存器中,让后会被释放掉;

  当运行到ChangeArray3(a)时:很多人不解为什么值没有改变,明明已经将值赋给参数;参数改变,为何main里的数值不变,因为此时,编译器在栈区为子函数分配空间;int a入栈,然后在子函数的栈区为其分配空间,也就是说main里的a和子函数里的a指向的根本不是同一个空间,那么你修改子函数里的a和main里的a,它们有半毛钱的关系啊?当函数运行完之后就被析构掉了,完全和main里的a不沾边啊;

  如果内存四区的模型建立不起来估计很难理解我的意思,前面我对内存四区进行过分析,当然我可能分析的并不好,大家可以自己找资料理解,如果内存四区建立起来了,我想指针这一块就迎刃而解了;

  

posted @ 2017-09-22 00:00  SmartGame  阅读(483)  评论(0编辑  收藏  举报