C 指针

作者: 心悦飞飞 | 来源:发表于2019-01-09 10:14 被阅读0次

    C 指针

    每一个变量都有一个内存位置,
    每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.
    `指针是一个变量,其值为另一个变量的地址,内存位置的直接地址.`
    就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
    指针变量声明的一般形式为:`数据类型 * 变量名称;`
    定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
    这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值.
    函数指针重要的功能就是实现回调函数、
    所谓回调函数就是函数先在某处注册、而在稍后某个需要的地方被调用。
    函数指针一般作为函数的参数来使用、可以根据需要传递自定义的函数来实现指定的功能。
    ` *` : 没有任何特殊含义, 仅仅是为了标识 这是一个指针变量
    1.指针只能用于保存地址
    2.同一个变量可以有有多个指针 指向他
    3.指针的指向可以修改
    4.不要访问野指针
    5.指针类型 是什么类型,就只能指向什么类型的数据
    6. 指针为什么要分类型? 因为当我们使用指针 去取值的时候, 系统就会自动根据指针的类型来确定 应该取多少个字节中的值
    
    int num; // 普通变量     num = 10;
    int * p; // 指针变量 , 在64位的编译器下 占用8个字节
    p = # // 将num的地址 存储到p这个地址中
    "(重点 : p = &num --- *p == num)"
    
    #include <stdio.h>
    
    // 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值 不会影响到 外面实参的值
    void base(int num)
    {
        num = 55;
    }
    // 数组作为函数的参数是地址传递,如果是地址传递 在函数中修改 形参的值 会改变影响到外面实参的值
    void array(int num[] )
    {
        num[1]=120;
    }
    
    
    // 指针就是专门用于保存地址的
    void point(int *p) //用什么接收地址? 指针 = 0ff123
    {
        *p = 119;
    }
    
    
    int main()
    {
        int num1 =100;
        base(num1);
        printf("%d\n",num1 );  //100
    
        int num2[]={1,2,3};
        array(num2);
        printf("%d\n",num2[1] );  //120
    
        int num4 = 99;
        int * num3 = &num4;
        point(num3);
        printf("%d\n",num4 );   //119
    
    }
    
    #include <stdio.h>
    // int *v1 = &a int *v2 = &b
    // *v1 = a *v2 = b
    // v1 v2 占用8个字节
    void swap(int *v1,int *v2)
    {
        int temp = *v1;
        *v1 = *v2;
        *v2 = temp;
    }
    
    int main()
    {
        // 1.定义一个函数交换两个变量的值
        int a = 10;
        int b = 5;
        printf("交换前: a = %i, b = %i\n",a,b);
        swap(&a, &b);
        printf("交换后: a = %i, b = %i\n",a,b);
        return 0;
    }
    
    #include <stdio.h>
    int demo(int v1,int v2,int v3,int *p1,int *p2);
    int main()
    {
        // 1.要求定义一个函数,传递三个值,返回这三个值和,差,平均值
        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; // 平均值
        // 我们想要的就是调用完函数之后,和差平均值对应的变量 都被 "修改"为对应的值
        int res3 = demo(a, b, c, &res1,&res2);
    
        printf("res1 = %i,res1 = %i,res1 = %i\n",res1,res2,res3);
    
        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;
    
        // 因为返回的是一个逗号表达式, 而逗号表达式的值 是最后一个表达式的值,所以返回的是average
        //    return sum,m,average;
    
        /*
        //    return  作用 1.返回值给调用者 2.结束函数
        //    注意点 : return后面不可以写任何语句, 因为执行不到
        return sum;
        printf("---");
        return m;
        return average;
         */
        return average;
    }
    
    #include <stdio.h>
    
    int name[]={110,119,120};
    void arr(int p[],int num){  // 如果参数为数组、则传入的数组参数是数组的内存地址、并没有将值复制一份给形参、而是直接将实参的地址传递进去
        p[1]=num;
        printf("%p\n",p );     // 获取内存地址 0x10cf86018
        printf("%p\n", &name); // 获取内存地址 0x1055ab018
    }
    int main(){
        printf("%p\n", &name[0]); // 获取内存地址 0x1055ab018
        printf("%p\n", &name[1]); // 获取内存地址 0x1055ab01c
        printf("%p\n", &name[2]); // 获取内存地址 0x1055ab020
        arr(name,1000);
        printf("%d\n", name[1]); // 1000
    
    }
    

    参考文章列表 特此表示感谢作者的分享、本文仅仅学习使用、欢迎指正!
    第08天C语言(09):指针-基本概念

    相关文章

      网友评论

          本文标题:C 指针

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