指针
指针变量:以地址为值得变量
指针变量得类型:声明中去掉变量名之后剩下得部分,就是这个指针变量的类型
指针变量指向的变量的类型:声明中去掉变量名和前面的一个*号,剩下的就是
*号
<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(&#
嵌入式C学习笔记201904
最新推荐文章于 2020-01-23 15:24:46 发布
指针 指针变量:以地址为值得变量 指针变量得类型:声明中去掉变量名之后剩下得部分,就是这个指针变量的类型 指针变量指向的变量的类型:声明中去掉变量名和前面的一个*号,剩下的就是*号 <1>*在声明中仅用来说明后面的变量是一个指针变量 <2>*在赋值符号=的左边,修改指针变量指向的那个变量的值-------间接寻址运算符 &...
摘要由CSDN通过智能技术生成