zoukankan      html  css  js  c++  java
  • C指针

    [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
    ",num1 ); //100
    
    int num2[]={1,2,3};
    array(num2);
    printf("%d
    ",num2[1] ); //120
    
    int num4 = 99;
    int * num3 = &num4;
    point(num3);
    printf("%d
    ",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
    ",a,b);
    swap(&a, &b);
    printf("交换后: a = %i, b = %i
    ",a,b);
    return 0;
    }
    View Code
    #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
    ",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
    ",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;
    }
    View Code
    #include <stdio.h>
    
    int name[]={110,119,120};
    void arr(int p[],int num){ // 如果参数为数组、则传入的数组参数是数组的内存地址、并没有将值复制一份给形参、而是直接将实参的地址传递进去
    p[1]=num;
    printf("%p
    ",p ); // 获取内存地址 0x10cf86018
    printf("%p
    ", &name); // 获取内存地址 0x1055ab018
    }
    int main(){
    printf("%p
    ", &name[0]); // 获取内存地址 0x1055ab018
    printf("%p
    ", &name[1]); // 获取内存地址 0x1055ab01c
    printf("%p
    ", &name[2]); // 获取内存地址 0x1055ab020
    arr(name,1000);
    printf("%d
    ", name[1]); // 1000
    
    }

    ---------------------
    [参考文章列表]() 特此表示感谢作者的分享、本文仅仅学习使用、欢迎指正!
    [第08天C语言(09):指针-基本概念](https://www.jianshu.com/u/6ad63655bbcf)

  • 相关阅读:
    信息收集与扫描
    流密码
    信息安全面临的威胁
    .net core Web应用启动类
    .net core 1.0 Web MVC 自定义认证过程
    彻底脱离循环与结束当下循环
    Java多线程:Thread中的实例方法
    memcached安装问题
    五月的仓颉
    json时间格式化方法
  • 原文地址:https://www.cnblogs.com/xiaofeifei-wang/p/10488991.html
Copyright © 2011-2022 走看看