欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

举两个栗子,理解C语言指针

程序员文章站 2024-02-29 17:52:40
...

理解指针

  1. 为什么要有指针?

    我们隔壁的隔壁宿舍最近经营起了零食店:

    「我:来5包卫龙大面筋,送到413!」

    「老板:么麻哒!来咧!」

    假设这栋宿舍楼没有门牌号:

    「我:来5包卫龙大面筋,送到……额……4楼一上楼从最左边往右第13个宿舍!」

    「老板:…… 」

    其实指针就像门牌号一样~便于定位查找内存中的数据。

    4GB的内存条有2^32个房间存数据,没有门牌号怎么找?从第一个开始数?哈哈。

    在C语言中可以这样理解一个变量:

    int main()
    {
        int a = 10;
        int *b = &a;
        return 0;
    }
    

    int a = 10;就是a这个人从房地产商(系统)那里买来一间房子,里面放着自己的东西10,此时a这个人的地址是系统知道的,然后a把这个地址(&)告诉了他的好朋友b,并且给了b这间房子的钥匙(*),这样b就可以通过地址找到这个房子地址并且在房间里取或者放自己的东西了。如果a不想让b乱动家里东西,可以和b说“不许乱动哦!”(const)。

  2. 指针变量

    这个其实挺好理解,在我们中文中,一般把强调的重点放在后面,指针变量是个变量

    像这样理解的还有:数组指针、指针数组

    指针变量是个变量,这个变量里面存的是地址数据。

    指针变量的大小:

    不论是什么类型(包括void *):

    32位环境下,指针变量的大小是4字节。

    64位环境下,指针变量的大小是8字节。

    emmm怎么理解呢?

    计算机给能访问的内存地址是规范的长度,全0到全1,32位系统下可编址的范围32个比特位(4字节),64位机器可编址的范围为64个比特位(8字节)。

    #include <stdio.h>
    int main(int argc, const char * argv[])
    {
        printf("void*\t%d\n", sizeof(void *));
        printf("char*\t%d\n", sizeof(char*));
        printf("int*\t%d\n", sizeof(int *));
        printf("float*\t%d\n", sizeof(float*));
        printf("double*\t%d\n", sizeof(double*));
        
        return 0;
    }
    

    光说不顶用,来验证下,在64位环境下:

    void*	8
    char*	8
    int*	8
    float*	8
    double*	8
    

    32位机下:

    void*	4
    char*	4
    int*	4
    float*	4
    double*	4
    
  3. void*

    可以做以下这样的事:

    void *vp;

    但是void*类型的指针不能被解引用,因为解引用后它不知道要访问多大的空间(int *解引用可以访问4字节的空间,char*解引用后可以访问1字节的空间)。

    void*可以接收任意类型的指针,这样就可以用它来做一些接口方面的事,这就方便了许多。