美文网首页
C语言的核心技术:指针系列

C语言的核心技术:指针系列

作者: KangSmit的算法那些事儿 | 来源:发表于2020-05-04 23:28 被阅读0次

    一个C程序的使用永远不能忽略指针,下面先从地址开始介绍。
    参考资料的部分内容来源:《C语言从入门到精通》
    需要领取书籍可关注我的微信公众号:kangsinx
    点击这里进入微信公众号文章末尾扫码关注

    1、地址

    系统的内存就好比是带有编号的小房间,如果想使用内存就需要得到房间编号。下图定义了一个整型变量i,整型变量需要4个字节,所以编译器为变量i分配的编号为1000~1003。

    image.png

    什么是地址?地址就是内存区中对每个字节的编号,上图所示的1000、1001、1002、1003就是地址。

    下图所示的1000、1004等就是内存单元的地址,而0、1就是内存单元的内容,换种说法就是基本整型变量i在内存中的地址,并且该地址从1000开始。由于基本整型占4个字节,所以变量j在内存中的起始地址为1004,变量i的内容是0。

    image.png

    从上面知道地址和变量是有区别的,并且地址的编号与变量类型的字节大小有关。

    2、指针

    那么指针又是什么呢?这里仅将指针看做是内存中的一个地址,多数情况下,这个地址是内存中另一个变量的位置,如下图所示。在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到所需的变量,这个变量的地址称为该变量的“指针”。下图所示的地址1000是变量i的指针。

    image.png

    变量的地址是变量和指针二者之间连接的纽带,如果一个变量包含了另一个变量的地址,则可以理解成第1个变量指向第2个变量。所谓“指向”就是通过地址来体现的。因为指针变量是指向一个变量的地址,所以将一个变量的地址值赋给这个指针变量后,这个指针变量就“指向”了该变量。例如,将变量i的地址存放到指针变量p中,p就指向i,其关系如下图所示。

    image.png

    如果你觉得上面的论述不好理解,那么这里再提供一个论述:

    假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示)。另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就称 p 指向了 c,或者说 p 是指向变量 c 的指针。

    image

    数学理解:已知*p=11A,&c=11A,那么就称 p 指向了 c,或者说 p 是指向变量 c 的指针,即 *p=&c。

    综上所述,指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

    更好的理解:如果有一个变量专门用来存放另一个变量的地址,它就是指针变量。例如上面的变量p就是指针变量。

    3、指针变量的使用

    • 如何定义一个指针变量?
    • 如何为一个指针变量赋值?
    • 如何引用指针变量?
      下面将一一介绍:
    (1)指针变量的一般形式

    如果一个变量包含指针(指针等同于一个变量的地址),则必须对它进行说明。定义指针变量的一般形式如下:

    类型说明 * 变量名

    其中,“*”表示该变量是一个指针变量,变量名即为定义的指针变量名,类型说明表示本指针变量所指向的变量的数据类型。

    (2)指针变量的赋值

    指针变量同普通变量一样,使用之前不仅需要定义,而且必须赋予具体的值。未经赋值的指针变量不能使用。

    “给指针变量所赋的值与给其他变量所赋的值不同,给指针变量的赋值只能赋予地址,而不能赋予任何其他数据,否则将引起错误。”

    C语言中提供了地址运算符“&”来表示变量的地址。其一般形式为: & 变量名; 如&a表示变量a的地址,&b表示变量b的地址。给一个指针变量赋值可以有以下两种方法。

    (1.1) 、定义指针变量的同时就进行赋值:

     int a;
     int *p=&a; 
    

    (1.2)、先定义指针变量之后再赋值:

     int a;
     int *p; 
    p=&a;
    

    下面来看一个例子:
    从任意输入两个数,使用指针的方法将这两个数输出。

    #include<stdio.h>
    main()
    {
        int a, b;
        int *ipointer1,  *ipointer2;/*声明两个指针变量*/
        printf("请输入两个数:\n") ;
        scanf("%d%d", &a, &b);/*输入两个数*/  //小心,在 %d%d中间加逗号会影响结果 
        ipointer1 = &a;
        ipointer2 = &b;     /*将地址赋给指针变量*/
        printf("这两个数为:%d,%d\n", *ipointer1, *ipointer2);
    }
    
    

    执行结果:


    image.png
    (3)指针变量的引用

    引用指针变量是对变量进行间接访问的一种形式。对指针变量的引用形式如:

    *指针变量

    其含义是引用指针变量所指向的值。例如:

    #include<stdio.h>
    main( )
    {
         int *p,q;
         printf("请输入一个数:\n");
         scanf("%d",&q);    /*输入一个整型数据*/
         p = &q;
         printf("这个数为:\n");
         printf("%d\n",*p); /*输出变量的值*/
    }
    
    

    执行结果:

    image.png
    (4)“&”和“*”运算符

    在前面介绍指针变量的过程中用到了“&”和“*”两个运算符:

    image.png

    运算符“&”是一个返回操作数地址的单目运算符,叫作取地址运算符,例如:
    p=&i;就是将变量i的内存地址赋给p,这个地址是该变量在计算机内部的存储位置。

    运算符 “ * ” 是单目运算符,叫作指针运算符,作用是返回指定的地址内的变量的值,例如前面提到过p中装有变量i的内存地址,则:
    q=*p;就是将变量i的值赋给q,假如变量i的值是5,则q的值也是5。

    相关文章

      网友评论

          本文标题:C语言的核心技术:指针系列

          本文链接:https://www.haomeiwen.com/subject/qnfyghtx.html