博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
间接赋值0级指针到一级指针
阅读量:6156 次
发布时间:2019-06-21

本文共 1958 字,大约阅读时间需要 6 分钟。

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

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

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

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

  

#include 
#include
#include
  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不沾边啊;

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

  

转载于:https://www.cnblogs.com/huhaihao/p/7572163.html

你可能感兴趣的文章
MFC控件的SubclassDlgItem
查看>>
如何避免历史回退到登录页面
查看>>
《图解HTTP》1~53Page Web网络基础 HTTP协议 HTTP报文内的HTTP信息
查看>>
unix环境高级编程-高级IO(2)
查看>>
树莓派是如何免疫 Meltdown 和 Spectre 漏洞的
查看>>
雅虎瓦片地图切片问题
查看>>
HTML 邮件链接,超链接发邮件
查看>>
HDU 5524:Subtrees
查看>>
手机端userAgent
查看>>
pip安装Mysql-python报错EnvironmentError: mysql_config not found
查看>>
http协议组成(请求状态码)
查看>>
怎样成为一个高手观后感
查看>>
[转]VC预处理指令与宏定义的妙用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>
MySQL 文件导入出错
查看>>
java相关
查看>>
由一个异常开始思考springmvc参数解析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
虚机不能启动的特例思考
查看>>