带你认识指针——C语言的灵魂(一)

前言


       最近复习考研的知识,有机会研究一下C语言的指针,今天就总结一下有时候让我们爱的要死,有时候也恨得要死的指针,到底是什么?书里指针那章的序言说到了,不掌握指针就是没有掌握C的精华,word指针看来真的有他的厉害之处啊。话不多说,开始总结。

       第一篇总结解决一下什么是指针的问题,做了一个小DEMO简要说明指针的用法。


指针定义

指针是一个值为内存地址的变量(或数据对象)


自己的理解:上边的定义简单扼要的告诉我们指针就是变量,变量又是什么呢?变量就是一块内存,就是一个地址,说白了指针就是保存内存地址的变量,有的书上也说了,指针就是地址。为什么要有指针呢?因为C语言的一大特点就是可以直接对物理操作,厉害了我的哥,所以说指针是C语言的一大灵魂嘛。


用内存图(来源于网络)来帮助理解:


1.首先定义了一个整型的变量,也就是分配了一个名叫year的内存空间,存放的内容是2016

2.定义了一个整型的指针变量,将year的地址付给了变量,也就是右边的指针指向左边的变量,因为现在指针里边存放的是year的地址,&这个符号是取地址的意思,下边会讲到

带你认识指针——C语言的灵魂(一)_第1张图片


指针声明


类型 + "*" + 变量名  = 指针

注:

1.C语言中NULL被定义为常量,第一行代表指针的初值设为空,表示指针不指向任何地址,不加有可能指向任意的地址

2.指针命名最好里边带有"P"

    int  *ptr=NULL;    // 等价于void *ptr  
    int  *ptr_num;
    char *ptr_name;
    float *money_ptr;
    double *p_price;


怎么用?(附赠小DEMO)


  • &:代表取地址
  • *:代表根据地址,找到变量,然后取变量值

    int num=9;
    int * ptr_num=#

    //取指针1的地址赋给指针2
    int * ptr_num2=&ptr_num;

    //%p指针占位符  % x 16进制占位符
    printf("num变量的地址是:%p\t%x\n",ptr_num,&num);
    printf("\n指针ptr_num的地址:%p\n",ptr_num2);

    //使用指针修改变量值
    *ptr_num=9999;//找到地址所指的内存地址,把这个地址的值改为9999
    printf("* ptr_num对应的值为:%d\n",*ptr_num);//取这个地址对应的值

带你认识指针——C语言的灵魂(一)_第2张图片


上边的代码主要演示了一下:取变量地址和取地址对应变量的值,这两个操作,一个用的&,后一个使用*


上边代码也展示了如果通过操纵指针来改变变量的值,我们在看看内存是怎么体现的

带你认识指针——C语言的灵魂(一)_第3张图片

综合的小DEMO:

int num1=1024;
    int num2=2048;
    int * ptr1;
    int *ptr2;
    ptr1=&num1;
    ptr2=&num2;
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    //将变量1的值,赋给变量2
    // num2=num1;*ptr2=*ptr1; 等价写法,可以把后者看成变量

    //直接操作指针
    ptr2=ptr1; //值没有变,地址变了

    printf("重新赋值后:\n");
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    *ptr2=1111;
    printf("重新赋值后:\n");
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

带你认识指针——C语言的灵魂(一)_第4张图片


后记


了解一个概念就是反复的去实践,看看不同情况下的操作会得出什么样的结果,概念在实践中体会的会更加的深刻

你可能感兴趣的:(-----,【C和C++】)