C语言易错点(函数里修改传入变量的值不会改变传入变量的指针)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chengdong1314/article/details/52766504

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/

函数里修改传入变量的值不会改变传入变量的指针   

相关语句如下:

uint8_t a,b,c;

    a=4;
    b=6;
    c=0;
    oled_printf(0,0,"a:%d b:%d c:%d",a,b,c);
    c=Max_Common_Divisor(a,b);
    oled_printf(0,1,"A:%d B:%d C:%d",a,b,c);

其中Max_Common_Divisor函数如下:

uint32_t Max_Common_Divisor(uint32_t a, uint32_t b)            
{  
      uint32_t  temp;                                                          
      if(a<b)                                                      
      {   
          temp=a;  
          a=b;    
          b=temp;  
    }                                                                     
       while(b!=0)                                                         
           {  
          temp=a%b;  
          a=b;                                                                    
          b=temp;  
    }  
      return a;                                                                

经过上面的运算输出结果如下:

a:4 b:6 c:0

A:4 B:6 C:2

实验结果可以证明:

不管Max_Common_Divisor函数对传入的变量a,b进行怎样的修改,在函数外边看(main)a,b这两个变量的值是不变的。

也可以这样分析编译的过程:

当执行Max_Common_Divisor函数时:

1.把a,b作为变量拷贝到R1,R2(按照单片机来解释),或者说当调用这个函数的时候a,b的值就放到R1,R2了

2.然后把R1,R2压栈,当需要这些变量的时候从堆栈中获取

3.用堆栈中的数据进行计算等等操作

4.最后退出函数

所以:不管函数里怎么改变传入的那两个变量,都不会改变函数外的数据,因为在调用这个函数的时候传进来的就不是函数外的数据的原件,而是一个备份而已

所以在主函数外看:a\b的值永远是4\6

这里为什么会让人混淆了,或许还有一点就是函数外面的变量名字和函数里面是一样的吧

展开阅读全文

数里变量的生命周期是什么

02-22

[code=C#]rnprotected void btnSave_Click(object sender, EventArgs e)rnrn SqlParameter[] parms =rn new SqlParameter("@xingming", txtxingming.Text.Trim()), //客户姓名rn new SqlParameter("@tel", txttel.Text.Trim()), //电话rn new SqlParameter("@address", txtaddress.Text.Trim()), //地址rn new SqlParameter()rn ;rnrn if (txtIDEdit.Value == string.Empty)rn rn SqlHelper.ExecuteNonQuery(SqlHelper.SqlConnection, CommandType.StoredProcedure, "yongfa365_ZhuaiZhiInsert", parms);rn JS.AlertTo("添加成功", "/ZhuaiZhi/ZhuaiZhi.aspx");rn rn elsern rn parms[parms.Length - 1] = new SqlParameter("@Id", txtIDEdit.Value.Trim());rn SqlHelper.ExecuteNonQuery(SqlHelper.SqlConnection, CommandType.StoredProcedure, "yongfa365_ZhuaiZhiUpdate", parms);rn Response.Redirect(Request["txtFromUrl"]);rn rnrnrnrnprotected void btnSave2_Click(object sender, EventArgs e)rnrn using (SqlConnection ConnNow = new SqlConnection(SqlHelper.SqlConnection))rn rn SqlParameter[] parms =rn new SqlParameter("@xingming", txtxingming.Text.Trim()), //客户姓名rn new SqlParameter("@tel", txttel.Text.Trim()), //电话rn new SqlParameter("@address", txtaddress.Text.Trim()), //地址rn new SqlParameter()rn ;rnrn if (txtIDEdit.Value == string.Empty)rn rn SqlHelper.ExecuteNonQuery(ConnNow, CommandType.StoredProcedure, "yongfa365_ZhuaiZhiInsert", parms);rn JS.AlertTo("添加成功", "/ZhuaiZhi/ZhuaiZhi.aspx");rn rn elsern rn parms[parms.Length - 1] = new SqlParameter("@Id", txtIDEdit.Value.Trim());rn SqlHelper.ExecuteNonQuery(ConnNow, CommandType.StoredProcedure, "yongfa365_ZhuaiZhiUpdate", parms);rn Response.Redirect(Request["txtFromUrl"]);rn rn rnrnrn[/code]rnrn===========================================================rn问题1:btnSave_Click好呢,还是btnSave2_Click好,为什么?rn问题1:这两个函数里的变量的生命周期是什么,是不是执行完后就自动没了? 论坛

没有更多推荐了,返回首页