• C语言——指针(函数)


    指针的引入
    为函数修改实参提供支持。
    为动态内存管理提供支持。
    为动态数据结构提供支持。
    为内存访问提供另一种途径。

    指针概述

    内存地址:

    系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字节),并为每一个内存单元进行了编号,内存单元的编号称为该内存单元的地址。一般情况下,我们每一个变量都是由多个内存单元构成的,所以每个变量的内存地址,其实就是这个变量对应的第一个内存单元的地址,也叫首地址

    变量指针:

    变量地址称为该变量的指针。变量地址往往是指变量在内存中第一个内存单元的编号(首地址)

    指针变量:

    存放其他变量地址的变量。

    指向:

    指针变量中存放“谁"的地址,就说明该指针变量指向了“谁”。

    *:指针运算符

    指针变量的定义

    语法:

    数据类型 *变量列表;

    注意:

    1.虽然定义指针变量 *a ,是在变量名前加上*,但是实际变量名为a,而不是*a。

    2.使用指针变量间接访问内存数据是,指针变量必须要有明确的指向;

    3.如果想借助指针变量间接访问指针变量保存的内存地址上的数据,可以使用指针变量前加*来接访问;指针变量前加*,也称为对指针变量解引用。

    4.指针变量只能指向同类型的变量,借助指针变量访问内存,一次访问的内存大小是取决于指针变量的类型。

    5.指针变量在定义同时可以初始化:这一点和普通变量是一样的。

    指针变量的使用

    指针变量的赋值:

    方式1
    int a,*p;
    p=&a;//指针变量的值是其他变量的地址

     

    方式2
    int a,*p,*q = &a;
    p =q;

    操作指针变量的值:

    int a,*p,*q = &a;

    p = q;
    printf("%p",p);//此时返回的是变量a的地址空间

    操作指针变量指向的值:

    int a =6, *q =&a;
    printf("%d”,*q)://6

    两个有关运算符的使用:

    &        取地址运算符。&a是变量a的地址。

    *         指针运算符(或称"间接访问"运算符),*p是指针变量p指向的对象的值。

    eg:

    1. #include
    2. void main()
    3. {
    4. int a,b;
    5. int *pointer_1, *pointer_2;
    6. a=100; b=10;
    7. pointer_1=&a;
    8. pointer_2=&b;
    9. printf("a=%d,b=%d\n",a,b);
    10. printf("pointer_1=%d,pointer_2=%d\n",*pointer_1,*pointer_2);
    11. }

    案例1:

    声明a,b两个一般变量,使用间接存取的方式实现数据的交换?

    (直接存取和间接存取都是数据互换,直接存取是交换值,间接存取是交换指向)

    代码:

    1. /*
    2. 需求:声明a,b两个一般变量,使用间接存取的方式实现数据的交换
    3. */
    4. #include
    5. void main()
    6. {
    7. // 声明5个变量
    8. int a = 3,b = 5,*p_a=&a,*p_b=&b,*p_t;
    9. // 交换前输出
    10. printf("%d,%d\n",*p_a,*p_b);
    11. // 交换位置
    12. p_t = p_a;
    13. p_a = p_b;
    14. p_b = p_t;
    15. // 交换后输出
    16. printf("%d,%d\n",*p_a,*p_b);
    17. }

    案例2:

    指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。

    代码:

    1. /*
    2. 需求:指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。
    3. */
    4. #include
    5. void main()
    6. {
    7. int a = 3,b = 5,*p_a = &a,*p_b = &b,*p_t;
    8. if( a < b)
    9. {
    10. p_t = p_a;// 操作指针变量,不会影响到数据本身
    11. p_a = p_b;
    12. p_b = p_t;
    13. }
    14. printf("按从大到小输出a,b的值:%d > %d\n",*p_a,*p_b);
    15. }

    指针变量做函数参数

    指针变量做函数参数往往传递的是变量的地址(首地址),借助于指针变量间接访问是可以修改实参变量数据的。

    案例1:

    需求:要求用函数处理,用指针变量作函数的参数。

    方式1:交换指向(指向的普通变量的值不变)

    eg:

    1. #include
    2. /* 需求:指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。
    3. */
    4. /* 自定义函数,实现两个数的比较 */
    5. void swap(int *p_a,int *p_b)
    6. {
    7. int *p_t;
    8. // 这种写法,只会改变指向,不会改变地址对应空间的数据
    9. p_t = p_a;
    10. p_a = p_b;
    11. p_b = p_t;
    12. printf("%d > %d\n",*p_a,*p_b); // 5 > 3
    13. }
    14. void main()
    15. {
    16. int a = 3,b = 5;
    17. if(a < b) swap(&a,&b); // int *p_a = &a,int *p_b = &b
    18. printf("%d > %d\n",a,b);// 3 > 5
    19. }

    方式2:交换值(指向的普通变量的值改变)

    eg:

    1. #include
    2. /* 需求:指针变量应用。输入a、b两个整数,按先大后小的顺序输出a和b。
    3. */
    4. /* 自定义函数,实现两个数的比较 */
    5. void swap(int *p_a,int *p_b)
    6. {
    7. int t;
    8. // 这种写法,只会改变指向,不会改变地址对应空间的数据
    9. t = *p_a;
    10. *p_a = *p_b;
    11. *p_b = t;
    12. printf("%d > %d\n",*p_a,*p_b); // 5 > 3
    13. }
    14. void main()
    15. {
    16. int a = 3,b = 5;
    17. if(a < b) swap(&a,&b); // int *p_a = &a,int *p_b = &b
    18. printf("%d > %d\n",a,b);// 5 > 3
    19. }
  • 相关阅读:
    Dlib+Opencv库实现疲劳检测
    【牛客网刷题】经典题型,确定不来看看?.
    JDK与JRE的关系
    从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能
    vue中在弹框中使用form表单,取消默认的回车提交效果-刷新页面
    雷神学习---视音频数据处理入门:RGB、YUV像素数据处理
    从GAN到WGAN(01/2)
    利用牛顿方法计算正数的平方根
    SpringSecurity6 | 默认登录页
    swift-类属性
  • 原文地址:https://blog.csdn.net/2201_75915488/article/details/140979716