美文网首页
指针之指犹如指月之指

指针之指犹如指月之指

作者: Enomothem | 来源:发表于2019-11-24 17:43 被阅读0次

    如愚见指月,观指不观月;计著名字者,不见我真实。

    Xx_前言

    C lang,不仅仅是一串串代码,如果你细心观察的话,就会发现其中蕴含着许多人生哲理。
    指针到底指向何方,我们看到的,真的是真实的吗?
    指月之指的故事,让我们明白了看待一切事物,不要只看其表面。
    指月之指,手指就是月亮的意思啊,而不是手指。
    文字,文字就是我想要表达的意思啊,你这么能去误读它呢。
    在我们生活中,常常充斥着诱惑,表面光鲜亮丽的东西越是诱人,然而缺蒙蔽了我们的眼睛,掩盖了它的内心。
    指月之指,指的是一个地方,那就是月亮,而我们就应该看月亮而不是手指。
    指针之指,指的是一个地址,那就是内存,而我们就应该看内存而不是指针。

    指针是C语言的灵魂,我怀着敬畏之心,学习着指针,体会到了指针的强大,同时也感受到了指针误用带来的可怕。
    切记!千万不要解引用为初始化的指针。
    切记!切记!切记!

    同时,我们可以解引用越界指针。这是C lang对指针的特殊操作,自然有它的妙处。
    数组定义了多少,就不能越界,就如我们,在什么层级,什么权限,就不能越权,和朋友是什么关系,就不能越级,而指针给出的答案,是可以越过的,但只能越出一步,不能再多。
    然而,人的世界是非常复杂 的。

    另外,指针之间是可以用关系运算符来比较的,还记得关系运算符吗,哈哈,非0即1,是是非非,无其它可能,简简单单的关系,再复杂也不会有人类之间的关系复杂了。但前提是必须同类型。
    我们经常会和别人比,甚至和不同世界不同类型不同层级的人比,但是比较的前提是双方都差不多,不然会相差悬殊,不然等着被比得一无是处吧,,哈哈。

    Ax_指针之指

    #include<stdio.h>
    
    int main(void)
    {
        int urn[5] = { 100, 200, 300, 400, 500 };
        int * ptr1, *ptr2, *ptr3;
        int a =2;
        char k = ' ';
        ptr1 = urn; // equal to &urn[0]
        ptr2 = &urn[2];
        printf("指针操作:\n");
    
        printf("%p,%p,%p\n",urn,&urn,&a);
        printf("指针值%15c取消引用指针%15c指针地址:\n",k,k);
        printf("ptr1 = %p%15c *ptr1 = %d%15c &ptr1 = %d %d\n", ptr1,k, *ptr1, k, &ptr1, ptr1);
    
        // 指针加法
        ptr3 = ptr1 + 4;
        printf("\n指针添加一个整数型:\n");
        printf("ptr1 + 4 = %p %10c *(ptr1 + 4) = %d\n", ptr1 + 4, k, *(ptr1 +4));
    
        ptr1++; // 递增指针
        printf("\n递增指针:\n");
        printf("ptr1 = %p%15c *ptr1 = %d%15c &ptr1 = %p\n", ptr1,k, *ptr1,k, &ptr1);
    
        ptr2--;  // 递减指针
        printf("\n递减指针:\n");
        printf("ptr2 = %p%15c *ptr2 = %d %15c &ptr2 = %p\n", ptr2, k, *ptr2, k, &ptr2);
        //恢复初始值
        --ptr1;
        ++ptr2;
        printf("\n恢复指针初始值:\n");
        printf("ptr1 = %p%15c ptr2 = %p\n", ptr1, k, ptr2);
        // 一个指针减去另一个指针
        printf("\n一个指针减去另一个指针:\n");
        printf("ptr2 = %p%15c ptr1 = %p%15c ptr2 - ptr1 = %td\n", ptr2, k, ptr1, k,  ptr2 - ptr1);
        // 一个指针减去另一个指针
        printf("\n一个指针减去另一个指针:\n");
        printf("ptr3 = %d%15c ptr3 - 2 = %d\n", ptr3, k, ptr3 - 2);
    
        return 0;
    }
    

    指针之指

    赋值:把指赋值给一个指针。可以是数组名,或是地址变量名,也可以是一个指针
    解引用:*运算符给出指针指向地址上存储的值。(这就是指针之指啊。)
    取址:和所有变量一样,指针变量也有自己的地址和指,&本身的地址。存储着指向内存的地址。
    指针与整数相加:整数先与指向类型的大小(int为4)相乘后再与初始地址相加。(但是不能超越数组范围,不过可以合理的越界哦。正好在末尾的第一个位置,这是允许的。)
    递增指针:递增指向数组元素的指针可以是该指针移动至数组下一个元素。如果是int等于加了4(因为int为4内存大小,相应的double为8)
    指针减去一个整数:指针必须是第一个运算对象,该整数先与指向类型大小相乘再用初始值减去乘积。
    递减指针:可以递增当然也可以递减啦。
    指针求差:可以计算出指针的差值(这个差值是类型的个数,在同一数组内的距离。)
    比较:两个类型相同的指针,使用关系运算符来比较。

    Bx_指针之怒

    用得好,效率高,滥用者,擦写数据代码,程序崩溃,电脑宕机。

    切记~
    不要解引用未初始化的指针
    切记!
    创建一个指针时,系统只分配了存储指针本身的内存,并为分配存储数据的内存。

    以下是有效操作和无效操作

    int urn[3];
    int * ptr1, * ptr2;
    有效
    ptr1++;
    ptr2 = ptr1 + 2;
    ptr2 = urn + 1;
    无效
    urn++;
    ptr2 = ptr2 + ptr1;
    ptr2 = urn * ptr1;
    
    
    

    相关文章

      网友评论

          本文标题:指针之指犹如指月之指

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