zoukankan      html  css  js  c++  java
  • 关于【指针作为形参,改变实参的值】的理解!

    0x01

      先上代码:

     1 #include <stdio.h>
     2 
     3 void swap(int *p, int *q)
     4 {
     5     int temp;
     6     temp = *p;
     7     *p = *q;
     8     *q = temp;
     9 }
    10 
    11 int main()
    12 {
    13     int a, b;
    14     int *pa, *pb;
    15     printf("Enter 2 numbers:
    ");
    16     scanf("%d, %d", &a, &b);
    17     pa = &a;
    18     pb = &b;
    19 
    20     printf("a = %d, b = %d
    ", a, b);
    21     printf("=====Changed======
    ");
    22     swap(pa, pb);
    23     printf("a = %d, b = %d
    ", a, b);
    24 }

      代码的作用:通过指针交换两个变量的值。

      运行结果:

      

    0x02

      指针是如何交换两个变量的值的?

      首先需要明白下面的东西:

      (1)星号"*"的两个作用:①定义指针变量  ②指明指针所指变量的值(间接访问)

      (2)指针变量作为函数参数,是将变量的地址传递给函数;

      分析:swap()函数的参数是指针变量,所以接收的是变量的地址,【(这段话是在网上看到的)指针传递的是变量的地址,也就是它在内存中的所在位置,它发生改变,变量就改变;一般变量做形参,传递的是变量的值,地址不发生改变,函数在执行过程中调用内存空间,执行完便释放内存空间,所以不改变。】

      在交换变量值的代码中,重要的是(*p = *q, *q = temp),这句代码的作用是,将指针q指向的内容赋给指针p所指的区域。

      自己的理解:*p = *q; *p指的是指针变量p(*号的作用是定义指针变量),*q指的是间接访问q所指区域中的值(*号的作用是间接访问),将这个值赋予p所指的区域,也就是【地址】,这个地址是传入的a的地址,所以a的地址(或者说a对应的内存空间)中存放的内容就改变了,成了q的所指区域中的值,也就是b的值,这样就完成了交换。重要的还是要分清星号*的两个作用。 ====但是还有疑问,值能直接赋给地址?或者说星号*在等号左右两边的意义不同,在左边表示变量,右边表示间接访问?====

      temp = *p;  temp是一个整型变量,*p是间接访问指针所指区域的内容,也就是a的值,所以这句代码的作用就是将a的值赋值给temp;

      *q = temp; temp之前被赋予a的值,*q指的是指针变量q(*号的作用是定义指针变量),值是b的地址,将a的值放在b的地址中,所以b对应的内存空间中的内容成了a的值。

    0x03

      下面代码也是同样的道理:

     1 #include <stdio.h>
     2 int main()
     3 {
     4     int a, *p;
     5     int b = 10;
     6     printf("Enter a number:
    ");
     7     scanf("%d", &a);
     8     p = &a;
     9     printf("a = %d
    ", a);
    10     printf("*p = %d
    ", *p);
    11 
    12     printf("
    =============
    ");
    13     *p = b;
    14     printf("a = %d
    ", a);
    15     printf("*p = %d
    ", *p);
    16 }

      首先指针p指向变量a,然后通过*p = b; 改变了a的值;

      运行结果:

      

      

    0x04

      其实不只是指针作为形参改变实参,而是指针就具有这个“特性”。

      

  • 相关阅读:
    菜刀失效以后得到web的方法
    mimikatz使用
    hydra使用教程
    web安全学习-攻击会话管理
    web安全学习-验证机制存在的问题
    web安全学习-绕过客户端限制
    基于MaxCompute/Dataworks实现数据仓库管理与全链路数据体系
    tensorflow学习|基于TF-IDF的垃圾短信预测
    WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
    CentOS7下安装CDH,clouderamanager,hadoop
  • 原文地址:https://www.cnblogs.com/mch0dm1n/p/5751583.html
Copyright © 2011-2022 走看看