嵌入式学习12(数组,指针,指针与数组)
数组
1、数组的定义:数据类型相同,连续存储的元素的集合。
特点:从0开始,可下标引用
2、 初始化方式有两种
Ø int a[5]={1,2,3};//未赋值的自动补零 //一次结清
int a[]={1,3,5,8};//此情况下可省
a[2][2]= {{1,2},{3}}; 等效于 a[][2]={{1,2},{3}}; //可省第一维
Ø int b[10]; //10表个数
b[0]=1; b[1]=1;…...//0和1表下标 //引用下标逐一赋值
3、注意事项,定义数组时,数组长度必需给定,二维数组可省前一位int a[][10];
int i=4,; 宏替换 #defineN 100
inta[i]; //错误,数组大小必须确定 改进方案 …….//以后修改宏即可修改大小
//VC下不行,Linux下可以,一维可以,二维不行 int a[N];
4、 多维数组分赃
Ø 对于:inta[4][3][2][2]={1,2,3,4,5,6,7,8};
共:4*3*2=24 个元素
a[0]: 3*2=6 个元素
a[0][0] : 2 个元素
分配情况为:{{{1,2},{3,4},{5,6}},{7,8},{},{}} //先六个六个一砍,再两个两个一砍
Ø 对于inta[6][3][4][5]={{},{},{},{{},{{13}},{1}}};
13为a[3][1][0][0]
1为a[3][2][0][0]
4、数组在函数与函数间的传递
Ø 复制传递 int zmx(int a[],int size)
Ø 地址传递 int zmx(int *a,int size) //指针即地址
指针
1、引入
变量:是程序语言对存储单元的抽象
地址:内存中,每个字节都有一个编号,称为地址
指针变量:内存单元的编号(地址)称为指针,用来存放地址的变量,称为指针变量
(在32位系统上,指针(地址)就是一个32位无符号整数,任何基类型的指针都占32位)
2、指针变量也像int、char那样是个变量,也有变量的各种特性,
指针变量的定义和初始化
(1)指针的定义形式:
[指针存储类型] <数据类型> *<指针变量名> //int *p:等价于 int* p;
(2)指针的初始化:
<数据类型*> <指针变量名> = <地址量>
int *p=NULL; //等价于int *p=0;//定义指针变量p,指向空地址。
指针的运算
1)指针的加减 n:以基类型宽度为单位移动指针
px+n : (px)+sizeof(px的类型)*n
px-n : (px)-sizeof(px的类型)*n
(2)两个指针相减
间隔距离是多少个单位(基类型宽度)
// px-py: (sizeof(px)-sizeof(py))/sizeof(类型);
2、 常用操作
*:取值
&:取地址,scanf函数就是用这个原理
%p:输出地址的占位符
指针即地址,指针变量是存地址的变量
指针与数组
1、两个易混淆的概念
Ø 指针数组:指针的数组,数组中的元素,是指针变量。
int *a[5]; 或 int* a[5];
Ø 数组指针: 数组的指针,占4个字节,指向一个数组。
int *a; 指向一维数组的指针
int (*a)[3]; 指向二维数组的指针,第一维维数省略了
int (*a)[2][3]; 指向三维数组的指针,第一维维数省略了
2、数组的特点:数组名是首元素的地址,也是数组的地址,是一个指针常量。
对数组的访问:
Ø 下标法:a[i][j]
Ø 指针法:*(*(a+i)+j)
Ø 混合法:*(a[i]+j)
指针访问数组例子
多维数组访问
a[i][j]=*(*(p+i)+j)
a[i][j][k]=*(*(*(p+i)+j)+k)