嵌入式C学习笔记201904

指针 指针变量:以地址为值得变量 指针变量得类型:声明中去掉变量名之后剩下得部分,就是这个指针变量的类型 指针变量指向的变量的类型:声明中去掉变量名和前面的一个*号,剩下的就是*号 <1>*在声明中仅用来说明后面的变量是一个指针变量 <2>*在赋值符号=的左边,修改指针变量指向的那个变量的值-------间接寻址运算符 &...
摘要由CSDN通过智能技术生成
指针
    指针变量:以地址为值得变量
    指针变量得类型:声明中去掉变量名之后剩下得部分,就是这个指针变量的类型
    指针变量指向的变量的类型:声明中去掉变量名和前面的一个*号,剩下的就是
*号
    <1>*在声明中仅用来说明后面的变量是一个指针变量
    <2>*在赋值符号=的左边,修改指针变量指向的那个变量的值-------间接寻址运算符
    <2>*在赋值符号=的由边,间接访问指针变量指向的那个变量的值---间接寻址运算符
&号
    <1>&& 逻辑与
    <2>&  按位与运算符(3&4)
    <3>&变量:取地址运算符
[]数组:存放同一种数据类型元素的数据结构
    <1>声明中,标识当前声明的变量是数组变量
    <2>出现在表达式中,标识下标运算符
指针数组:
    char *s[2]={"world",linux};
    printf("%s\n",s[0]);
    printf("%s\n",*s+1);
    printf("%s\n",*(s+1));
数组指针:
    char (*s)[2]={"world","linux"};

作用域:变量的作用范围(能被使用的范围)
    <1>函数作用域:函数内使用的非静态局部变量仅在函数内具有作用域
    <2>文件作用域:定义在函数外的变量就是这种作用域
    <3>块作用域:定义在函数内的另外一对{}内的变量,就是这种作用域
    <4>函数原型作用域:作为函数入口参数的变量仅在函数内有效
生命周期:变量被开辟空间,直到回收占用空间的这段时间,就是这个变量的生命周期
    <1>自动生命周期:变量所在的函数被调用,运行到这个变量所在行时,才会开辟这个变量的内存;直到函数调用结束就回收这个变量的内存空间。
    <2>动态生命周期:在程序运行过程中,才动态申请变量占用的内存,这样的变量就具有动态生命周期;直到动态释放才回收内存空间
    <3>静态生命周期:在程序启动时,就会开辟空间,直到程序退出才被回收内存

链接性:
    <1>外部链接 :extern
    <2>内部链接 :static
    <3>无链接

static:静态
    <1>用来修饰局部变量,称为静态局部变量,改变局部变量的生命周期(自动生命周期->静态生命周期)
    <2>用来修饰全局变量,这个变量称为全局静态变量(这个变量变成本文件私有的一个全局变量)

存储类型:static/extern/register/auto

extern:用来声明外部变量(外部变量指的是非静态全局变量)

内存:段式结构
    从内存低地址到高地址:
      用户空间段:
      低|<1>代码段:函数
        |       .text:函数
        |       .rodata:只读数据
        |<2>数据段:
        |       .data:以及被初始化的变量
        |       .bss:block started by symbol以符号开始的段,未被初始化的变量
        |            包括初始化为0的
        |
        |<3>堆区heap:存放程序运行过程中动态申请的变量的内存
        |<4>栈区stack:存放函数内非静态定义的变量
       内核空间段
      高|<5>内核

大小端模式:
    大端架构:数据的最低位存放在内存的低地址
    小端架构:数据的最高位存放在内存的低地址

变长数组:VLA(variable length array)
    变长数组的定义:数组的元素个数是变量,而不是常量
    <1>变长数组不能在声明的同时进行初始化
    <2>不能定义静态的变长数组
    <3>不能定义全局的变长数组

const:定义一个只读变量,这个变量的值是不变的
    经常用来修饰函数的入口参数,使得const修饰的参数在函数内不能被修改,只能被访问

指针类型变量作为函数的参数:
    void foo(char *s){}
    char *s = "12345";
    foo(s);

数组类型变量作为函数的参数:数组类型作为函数的入口参数,类型会自动转换为指针类型
    void foo(char *s){}
    char s[] = "12345";
    foo(s);------->数组名在表达式中或者在函数的参数中,其类型已经退化为指针类型
  优势:<1>不必将整个数组的副本传递给函数,仅传递数组的首地址即4字节或8字节的地址值,从而减少CPU的开销
       <2>如果不转为指针类型,函数传递的将是数组的副本,意味着对形参数组的修改不会影响到实参数组
       <3>可以传递数组的一个连续片段
       <4>传递一个大数组不影响效率,因为传递时只传递首地址

函数指针:int (*)(int,int)
    int max(int a,int b){return a>b?a:b;}
    int (*pm)(int,int);//函数指针类型pm:int (*)(int,int)
    pm = &max;
    printf("max=%d\n",(*pm)(3,5));//pm(3,5)因为函数名在表达式中就表示函数的起始地址
    printf("max=%d\n",pm(3,5));
    printf("max=%d\n",(int (*)(int,int))(0x400526)(3,5));//函数地址

函数指针数组:int (*arr[])(int,int)={max,min};
    printf(&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值