嵌入式学习 Day12

一. 二维字符型数组做函数形参:


char s[3][10] = {"hello","world","china"};

形式上:
void printStr(char s[ ][10],int row)     //注意需要传行数,因为操作多个字符串

本质上:
void printStr(char (*s)[10],int row) 
 
实参:
printStr(s,row);       //数组名 行数

练习:
   准备3个字符串 
   实现函数 找出最大值 
   
练习:
      准备3个字符串 
      排序 

      
二. 标识符 、作用域 、 可见性

1.作用域:

 变量值作用的范围     
    
    局部变量 --- 一定在某一个{} 范围内
    全局变量 --- 不在任何一个{} 范围内

时间上去区分:


动态变量(局部变量) :空间是开辟在栈上的--自动申请自动释放

生命周期 : 从定义的语句开始,到所在的作用域范围结束 
 
静态变量 (全局变量) :从程序一开始运行,就存在,直到程序结束时,销毁 
     
   
    注意:
    全局变量(静态变量) 
      
    1.不能用变量进行初始化,只能用常量初始化                         
    2.静态区的变量 只会被初始化一次 

    3.值具有 继承性       

2.可见性:

程序运行到某个点,哪些标识符可见

标识符的可见性的规则:
1.先定义,后使用 
2.同一作用域中,不能有同名标识符
3.在不同的作用域,同名标识符,相互之间没有影响 
4.如果是不同的作用域,但是作用域之间存在嵌套关系,
 则,内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。
(就近原则

 auto int a;          //这个是一个自动变量 --- 栈上开辟的变量

 register int a;    //在寄存器中开辟空间 
                           //建议性 ,计算机不一定听
                         考点: 不能 & (取地址)


register int i;                  //大量重复运算时,避免cpu从内存中反复取值再运算再放值取值加快运算
for( i = 0; i < 100000000; ++i)
{
}

extern int a;     //扩展 延伸 


1.表示 此时这个a 不是在当前文件中定义的 ,如果要用,请到别的文件中寻找
2.一般使用在多文件编程中,如果想在当前文件使用别的文件中的 全局变量 ,此时,可以使用 extern int a; 在当前文件下做声明 。相当于,把别的文件中的变量作用域扩展到当前文件

  static 修饰局部变量
        //将局部变量 存储在了 全局区(静态区)
        //将局部变量的生命周期延长 
  static 修饰全局变量
       //表示 将全局变量 的作用域限定到本文件中 ,避免工程中与其他文件发生数据冲突
       //别的文件中不能extern了     
  extern 可以放在函数声明中  --函数声明 
       //表示的意思 --将函数作用域扩展到当前文件
  static 加在函数前面 
       //  此时效果与修饰全局变量效果一样 
       // 将函数作用域限定到本文件中

三. 指针:

   指针+ 基本数据类型 
   指针+ 数组 
   指针+ 函数 
   指针+ 指针 

1.指针变量

语法:
   基类型   * 指针变量名;
   
   基类型            //基类型 表示 指针变量 指向的目标的 数据类型
   *                     //表示此时定义的变量 是一个指针类型的变量   
   指针变量名    // 标识符命名规则 + 见名知意         
  
  int * p;            //表示定义了一个指针类型的变量p    

 野指针 ---指向不明确 ,随机

 int * p ;               //指向随机地址

 int * p = NULL;     //NULL 表示 0号地址,而0号地址是系统用的,会段错误。这是一个好的书写习惯

访问变量的两种方式:
直接访问 
间接访问 通过地址访问到的 

 * 指针运算     //单目运算符 ,运算数必须是指针类型的值(地址)
 
 * p 过程
 1.首先拿出p指针变量中的值(地址) 到内存中定位 
 2.从定位处开始,偏移出sizeof(基类型)大小的一块空间 
 3.把这块空间当做一个 基类型的 变量来看  

4.short *p   和  int a ,*p对于a而言只能代表其高位的两个字节中的数值

 被调修改主调 

1.想修改谁,就把谁的地址传过去 
2.必须要做 * 运算(间接访问),实现修改 

练习:
   求两个数的和 --函数 
   int add(int a,int b)
   {
      return a + b; //只能带出一个结果 
   }

练习:
    找出两个数中最大值 最小值 


练习:
    main函数中有两个数据
    a=10,b=20
    写个函数
    交换a b的值
    swap()    

2. 指针的运算

1. & 
2. * 
3. p+1      //指向了下一个一基类型的数据
                //跳过了一个基类型 
4. p++ 


3. 指针 + 数组 

一维整型数组 

int a[5];     //a首元素的地址 
                //a[0]  -- int型 
                //&a[0] -- int * 
          

int *p = &a[0];
         = a;          
       


练习:
     找最大值 ,指针的方式访问  
     

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值