美文网首页
指针的概念和练习

指针的概念和练习

作者: 越天高 | 来源:发表于2018-11-21 21:59 被阅读10次

    基本数据类型作为函数的参数是值传递, 在函数中修改形参的值不会影响到外面实参的值,数组作为函数的参数是地址传递, 如果是地址传递在函数中修改形参的值会影响到外面实参的值, 指针就是专门用于保存地址的。

    1 如何定义指针变量:

    普通变量:
    数据类型 变量名称;
    指针变量:
    数据类型 * 变量名称;

    数据类型 : 说明将来指针变量能够保存什么类型的变量的地址;
    注意: 指针变量是什么类型, 那么将来就只能保存什么类型变量的地址,
    例如: 指针变量是int类型, 那么将来就只能保存int类型变量的地址
    * : 没有任何特殊含义, 仅仅是为了标示这是一个指针变量
    变量名称 : 用于区分不同的变量

    int num; // 普通变量
    num = 10;
    
    int *p; // 指针 , 在64位编译器下占用8个字节
        // 千万注意: 指针变量只能存储地址
    p = # // 将num的地址存储到p这个指针中  p == &num
    
     printf("num = %p\n", &num)
      printf("p = %p\n", p);
        // 指针变量前的*号代表访问指针变量指向的那一块存储空间
        // *p == num
        *p = 55;
        printf("num = %i\n", *p);
    
    

    练习

    交换两个int变量的值

    void swap(int * v1, int * v2)
    // int *v1 = &a, int *v2 = &b; 
    // *v1 == a  *v2 == b
    {
        int temp = *v1; // int temp = 0ffc13
        *v1 = *v2;
        *v2 = temp;
    }
    
    int main(int argc, const char * argv[]) {
        int a = 10; 
        int b = 5; 
        printf("交换前:a = %i, b = %i\n", a, b);
    //    int temp = a;
    //    a = b;
    //    b = temp;
        swap(&a, &b);
        printf("交换后:a = %i, b = %i\n", a, b);
        return 0;
    }
    

    定义一个函数传递三个值, 返回这三个值得和,差,平局值

    
    int demo(int v1, int v2, int v3, int *p1, int *p2)
    {
        int sum = v1 + v2 + v3;
        *p1 = sum;
        int m = v1 - v2 - v3;
        *p2 = m;
        int average = sum / 3;
        
        return average;
        
        
        // 因为返回的是一个逗号表达式, 而逗号表达式的值是最后一个表达式的值, 所有返回的是average
        // return sum, m, average;
    }
    
    int main(int argc, const char * argv[]) {
        // 要求定义一个函数, 传递三个值, 返回这三个值得和,差,平局值
        int a = 10;
        int b = 20;
        int c = 30;
    //    int res =  demo(a , b , c);
    //    printf("res = %i\n", res);
        
        // 定义三个变量用于保存计算结果
        int res1 = 0; // 和
        int res2 = 0; // 差
    //    int res3 = 0; // 平局值
        
        // *p1 == res1 *p2 == res2
        // 我们想要的就是调用完函数之后, 和差平均值对应的变量都被"修改"为对应的值
       int res3 = demo(a, b, c, &res1, &res2);
        
        printf("和 = %i, 差 = %i, 平均值 = %i\n", res1, res2, res3);
        
        return 0;
    }
    

    指针的主意地点

    1.指针只能保存地址
    2.同一个变量可以有多个指针指向它

        int num = 10;
        int *p = #
        // *p == num
    //    num = 55;
        *p = 55;
        
        int *p1 = p;
        *p1 = 100;
        
        int *p2 = #
        
        printf("%i\n", *p);
    

    3.指针的指向可以修改

    int a = 10;
        int b = 5;
        
        int *p = &a;
        *p = 88;
        
        p = &b;
        
        *p = 44;
        
        printf("%i\n", a);
        printf("%i\n", b);
    
    

    4.不要访问野指针(没有赋值的指针, 我们称之为野指针)

        int *p;
        int *p = NULL; // 0
        printf("%i\n", *p);
    

    5.指针类型是什么类型, 就只能指向什么类型的数据

        int num = 10;
        char charValue = 'l';
        double doubleValue = 9.9;
        
    //    int *p = #
    //    int *p = &charValue;
    //    int *p = &doubleValue;
        
        double *p = &doubleValue;
        printf("%lf\n", *p);
    

    多级指针

    1.拷贝需要指向的变量的数据类型和变量名称
    2.在数据类型和变量名称之间加上一颗星
    3.修改变量名称

        char charValue = 'l';
        char *charValueP;
        charValueP = &charValue;
    
        char **charValuePP; // 不管有几颗*只要是指针变量就占用8个字节
        charValuePP = &charValueP;
    
         charValue = 'j';
         *charValueP == charValue
         *charValueP = 'j';
        
        // &charValue == charValueP
    
        printf("&charValue = %p\n", &charValue);
        printf("charValueP = %p\n", charValueP);
        // &charValueP == charValuePP
        printf("&charValueP = %p\n", &charValueP);
        printf("charValuePP = %p\n", charValuePP);
    
        char c = 'a';
        char *cp;
        cp = &c;
        char **cpp;
        cpp = &cp;
        char ***cppp;
        cppp = &cpp;
        printf("cppp = %c\n", ***cppp);
         /*
         *cp == c;
         *cpp ==  cp;
         **cpp == *(*cpp) == *cp == c
         多级指针的操作, 最简单的方式, 就是通过几颗星来存储, 就通过几颗星来访问
         还有一种方式就是画图, 看图片中有几个箭头, 有几个简单就用几颗星来访问
         */
        printf("c = %c\n", c);
        printf("*cp = %c\n", *cp);
        printf("&c = %p\n", &c);
        printf("cp = %p\n", cp);
        printf("*cpp = %p\n", *cpp);
        printf("**cpp = %c\n", **cpp);
    

    指针为什么要分类

    mac系统中的指针无论是什么类型, 几级真正都占用8个字节
    由于Mac是64位了, 32 = 4 * 8; 64 = 8 * 8;
    因为当我们利用指针去取值的时候, 系统就会自动根据指针的类型来确定应该取对少个字节中的值

        int *ip;
        double *dp;
        double **dpp;
        printf("cp = %lu, ip = %lu, dp = %lu, dpp = %lu\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(dpp));
      int  intValue = 1230; 
        char charValue = '1';
         /*
         00110001
         11001110
         00000100
         00000000
         
         00000000 00000100 11001110 00110001
         */
        /*
        int *charValueP;
        charValueP = &charValue;
        
        printf("%i\n", *charValueP);
        printf("%i\n", 0b00000000000001001100111000110001);
         */
        
        /*
         11001110
         */
        char *p = &intValue;
        printf("%i\n", *p);
              
    
    

    相关文章

      网友评论

          本文标题:指针的概念和练习

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