• c语言指针概念解释_初步


     不要阅读本文,格式不好看,最重要的是知乎上有多个优秀的答案,结合着看更容易理解。本人只是作学习笔记,自己复习时,也会跳到知乎上看原答案。

     
     
    作者:Wayne
    链接:https://www.zhihu.com/question/24466000/answer/659429892
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     
    不理解指针,是因为有人教错了你。
    有人告诉你,指针是“指向”某某某的,那就是误导你,给你挖了个坑。初学者小心不要误读这“指向”二字。

    第一,“指针”通常用于保存一个地址,这个地址的数据类型在定义指针变量时确定。
    举个例子,做个比较:
    int a; //定义一个变量a,用于保存一个int类型。
    int * b; //定义一个指针变量b,用于保存一个地址,这个地址所保存的数据应该是int类型。

    第二,是变量就应该可以赋值,指针变量也一样。但一般不会给指针直接赋值一个数值,而是将其他变量的地址赋值给指针,或者其他指针的值赋值给这个指针。
    继续上面的例子:
    b=&a; //把变量a的地址赋值给b。“&”操作是取变量的地址。
    继续举例:
    int * c; //我们又定义一个指针c
    c=b; //将b的值赋值给c,上面已经知道b是指针,它的值是a的地址,那么现在c 的值和b一样,也是个a的地址。

    第三,指针变量保存的值,也就是地址是可以变的。
    举个数组初始化的例子:
    int d[100];
    int * e;
    e=&d[0]; //e保存了数组d的第一个数据的地址
    for (int i=0; i<100; i++){
      *e = 0; //把该地址中的数据赋值0
      e++; //地址累加一次,也就是数组中下一个数据的地址
    }
    指针和其他变量一样,可以运算(一般是加减),也可以重新赋值。
    注:大概只有内存连续的情况,才可以对对地址加减吧。

    第四,指针有啥用。
    比方说,我们有个函数,如下:
    int add(int x){
      return (x+1); //把输入的值加1并返回结果。
    }
    好了,应用的时候是这样的:
    {
      int a=1;
      a=add(a); //add函数返回的是a+1
      //现在 a等于2
    }
    很简单吧,就是把a都累加一次。
    用指针怎么写:
    void add(int *y){ //给入的是一个int指针,是一个地址。
      *y = *y + 1; //* 是指引用 这个地址所保存的变量
      //这条语句的意思就是,把这个地址里的值加1,然后放回这个地址(硬件层次)。
    }
    把这个函数用起来:
    {
      int a=1;
      add(&a); //把a的地址传到函数里
      //add函数,就是把a的值加1,再放回到变量a里。
      //现在a等于2
    }
    试想一下,如果我们要对一个数据结构里的数据进行处理,那是不是就该传入这个结构的地址,在函数中依靠指针来引用这个地址的数据结构,进行运算。

    第五,若已有一个指针变量,可不可以用另外一个指针来保存这个变量的地址呢。
    可以的。
    一个变量保存另一个指针的地址,那它就是通常所说是“指针的指针”了。
    通常,指针的指针多用做(或指的是)函数指针或数据结构中有指针的情况。初学者搞不清,就不要勉强了。

    第六,空指针可怕吗?
    我们知道,一个变量要赋值后才能用,指针也是一样。指针不赋值(不给定地址)就拿来用,是不是也要出错。这个就是空指针。一般把指针赋值为Null,就是表明这个指针是空的,不能用。所以程序中一定要经常判别指针不是Null才能用。

    最后,初学C语言,最好把复合的语句拆开来看,比较容易理解。像 int *a=&b; 这种,拆成
    int * a;//定义一个int类型的指针变量a
    a=&b;
    就好理解了。
     
    上面所说的,是指针比较基础的东西,希望能帮助初学者学习理清思路。
     

     ===================

    注,指针变量定义最好加上后缀让人一看名字就知道这是个指针变量,如:

        char *cPtr; // pointer to a character
        int *iPtr; // pointer to an integer
        float *fPtr; // pointer to float
        double *dPtr; // pointer to a double
        
        char *c_name_ptr;
        int *i_age_ptr;
        float *f_score_ptr;
        double *d_num_ptr;

    c,i,f,d表示了指针类型,Ptr后缀表明是个指针变量。

    注:示例后四行是自己看资料,想的写法最好看专业资料有选择的吸收;

  • 相关阅读:
    RecyclerView+PageSnapHelper实现ViewPager效果+自动翻页
    webview设置不弹出权限请求弹窗
    Android加载webview网页卡顿卡死,webview开启debug模式
    jira部署
    机器人视觉抓取论文及代码资源
    Vision-based Robotic Grasping From Object Localization, Object Pose Estimation to Grasp Estimation for Parallel Grippers: A Review
    机械臂智能抓取涉及什么技术?
    http://wiki.ros.org/joint_trajectory_action
    Shuran Song
    Github上优秀的.NET Core项目
  • 原文地址:https://www.cnblogs.com/Tpf386/p/13830554.html
Copyright © 2020-2023  润新知