分享

c/c++语言学习痛苦的根源指针(一句话就搞懂)

 thchen0103 2017-02-18

c/c++语言学习痛苦的根源指针(一句话就搞懂) 指针这么复杂的内容取得名字很难让人理解,如果直接叫内存地址,可能更容易让人理解,指针其实就是存放内存整数地址的变量,注意是一个整数,但这个整数地址不是实际的操作系统中的内存地址,而是由映射地址(所以多进程间共享内存需要特殊的接口)。

比如你写一段代码

c/c++语言学习痛苦的根源指针(一句话就搞懂)

int xcj=10; 程序执行这段代码时就会在内存中申请一个地址1000存放这个变量,并且把这段内存空间的值设为10。当执行int b= 20时会再申请一个地址,我们X86系统的栈的地址是由大往小编号的,i的地址1000,i的大小在32位系统中是4个字节,所以b的地址就是1000-4=996;指针变量ptr本身也是一个变量所以它本身也有一个地址就是系统996-4 = 992,而他的值就是一个指针了就是i的地址1000。

在C和C++语言中一切都是地址

C/C++语言用变量来存储数据,用函数(包括类的成员函数)来定义一段可以重复使用的代码,C++中虚函数表来解决多态问题,它们最终都要放到内存中才能供 CPU 使用。

数据和代码(就是cpu指令列表)都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,其实是给我们看的,不是给计算机,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多