C-lang-pointer


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

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;

文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录