博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
操作变量实际是通过地址来操作内存空间
阅读量:6966 次
发布时间:2019-06-27

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

  因为前面已经写了很多关于指针的见解,我之前写过,指针是通过地址来操作它所指向的空间,就是一个指针你得给它分配一个可用的内存空间的地址,这样你才可以去操作这块地址;这个地址是这么来的,你可以将它指向一个变量或者手工分配等;

  那么这个地址有是什么,我的理解是cpu的内存编号,也就是说关于内存四区的编号,这个编号分的特别细致,应该是一个字节一个编号;

  然后我们的变量相当于一个门牌号,通过这个门牌号来找到这个地址;也就是我们可以通过 & 取出这个变量的地址编号;

  那么也就是说我们实际上是通过地址编号来操作内存空间的,在换句话说就是,我们也可以直接通过地址编号直接操作内存空间;

  那么下面我们来做一下实验:

#include 
#include
#include
int main(){ int a = 0; int *b = NULL; a = 1;//给a赋值 printf("&a:%d\n",&a);//打印a的地址//2686744 printf("a:%d\n",a); system("pause"): return 0;}

  在这里我们取出a的地址,我们可以发现是2686744(这个在不同的电脑或者编译器上应该是不一样的,但是道理都是一样的);然后我们知道什么样的指针类型才能操作什么样的变量;也就是说如果我们想要操作内存空间我们需要知道这到这块空间是什么类型的吧!

  也就是说a是int类的变量,然后这个地址就和指针是一样的了;我们需要声明它的类型 (int *)2686744,而指针是如何操作内存空间的加一个 * 号;即*((int *)2686744)

  代码如下:

int main(){    int a = 0;    int *b = NULL;       a = 1;//直接赋值    printf("&a:%d\n",&a);//打印a的地址//2686744    printf("a:%d\n",a);    printf("&c:%d\n",&c);//2686739    printf("%c\n",c);    //间接赋值    //1.通过内存编号    *((int *)2686744) = 2;    printf("a:%d\n",a);    //2.通过指针    b = &a;    *b = 3;    printf("&b:%d\n",&b);    printf("b:%d\n",b);//我们发现b和a的地址一样 和&b不一样    printf("a:%d *b:%d\n",a,*b);//a = *b    return 0;}

  然后我们可以发现通过内存编号成功改变数值,就和通过指针是一样的,也就是说我们其实是通过地址来操作内存空间的;也就是编译器会吧我们写的代码转换成通过内存编号来操作空间;

  至于变量名和内存空间的关系,下次再写吧!

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

你可能感兴趣的文章
mybatis.xml(理解的相对局限)
查看>>
详解VirtualBox虚拟机的四种网络设置
查看>>
关于学习区块链的推荐内容
查看>>
【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
查看>>
https原理通俗了解
查看>>
iOS开发debug集锦
查看>>
go-fasthttp源码分析
查看>>
RaspberryPi学习之SD卡文件修改及备份
查看>>
我的友情链接
查看>>
Java版InfluxDB工具类
查看>>
Python os/shutil/path 模块
查看>>
python学习笔记操作mongodb(九)
查看>>
[转]在A*寻路中使用二叉堆
查看>>
【Cloud Foundry 应用开发大赛】“17轻松”文章采集应用
查看>>
第七节 泛型(Generics)
查看>>
union的内存分布
查看>>
自己的技术博客
查看>>
lamp 编译参数
查看>>
FastDFS之Binlog同步
查看>>
谷歌Quickoffice现免费面向所有用户
查看>>