020-29815005
预约专线时间:09:00-23:59

C语言指针很难吗?

新闻来源:本站 日期:2021-07-02
指针,要想说明白你是不容易的啊!很多初学指针的人都会如此感慨。我经常思考这个问题,为什么?事实上,生活中到处都有指针,我们也到处在使用它。拥有它我们的生活才更方便。没指针,生活就不方便。没有相信?看看下面的例子。
    举个例子:比方说你想让我借一本书给你,我去了你的宿舍,但你住不住,所以我把书放在你二楼三楼的书架上,写了一张便条,放在你桌上。便条上写着:你要的书在三楼二楼的架子上。等你回来后,看到这张便条,你就会知道我借你的书放在哪里了。考虑一下,这纸条的作用,纸条本身并不是书,它上面也没放书。那你怎么知道书的位置呢?是因为那张纸条写的是什么!这个纸条实际上是个指针。书上的内容并非书本本身,而是书的地址,这是你从纸条上找到我借给你的这本书。

    一台电脑里所有的数据都要放在内存中,不同类型的数据占用不同的字节数,比如int占用4字节,char占用1字节。要正确地存取这些数据,每个字节都要编上号码,就像门牌号、身份证号码一样,每个字节都是唯一的,根据编号可以准确地查找到某个字节。

    以下代码说明如何输出地址:

    include

    intmain(){

    inta=100;

    charstr[20]="c.biancheng.net";

    printf("%#X,%#X\n",&a,str);

    return0;

    返回0;

    }

    经营成果:

    0X28FF3C,0X28FF10。

    %#X表示输出为十六进制并且带有前缀0X。一个变量,用于存放整数,需要在前面加上&以获得其地址;str本身代表字符串的首地址,无需加&。


C语言


    全都是地址。

    用C语言存储数据,用函数来定义一段可重复使用的代码,这些代码最终都被放入内存中以供CPU使用。

    在存储器中,数据和代码都以二进制形式存储,计算机无法从格式上区分某个特定的内存究竟是存储数据还是代码。将程序装入存储器后,操作系统会给不同的存储器分配不同的权限,具有读、写权限的存储器就是存储器的代码,而拥有读写权限的存储器就是数据。

    CPU仅能通过地址获取存储器中的代码和数据,程序在执行时告诉CPU要执行的代码和要读写的数据的地址。当CPU需要写入数据时给代码区地址时,如果程序意外出错,或者开发人员有意为其设置内存访问错误。这个存储器访问错误误解被硬件和操作系统截获,程序崩溃,程序员无法挽回。

    CPU访问内存时需要一个地址,而非变量名和函数名!可变名称和函数名仅仅是地址的助记符,当源文件被编译并链接成可执行程序之后,它们就被替换为地址。在编译和链接过程中,一个重要任务是找到这些名字对应的地址。

    假定内存中a,b,c的地址,分别是0X1000,0X2000,0X3000,则加法运算c=a+b;将转换成如下形式:

    0X3000=(0X1000)+(0X2000);

    ()代表取值操作,整个表达式的意思是,从地址0X1000和0X2000上取出值,将它们相加,然后将相加的结果分配给地址为0X3000的内存。

    可变名称和函数名给我们带来了便利,让我们在编写代码的过程中能够使用容易读懂的英文字符串,不必直面二进制地址,这种场景简直让人崩溃。

    值得注意的是,尽管变量名、函数名、字符串名和数组名在本质上是相同的,它们都是地址的助记符,但是在编码的过程中,我们认为变量名就是数据本身,而函数名、字符串名称和数组名称则代表代码块或数据块的首地址。

    内容来源于网络,版权归原作者所有。