C51构造数据类型

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针的概念

变量与地址
内存中每个字节有一个编号-----地址 内存 0 …... 2000 2001 2002 2003 2005 …. ..
程序中: int i; float k;
编译或函数调用时为其分配内存单元
i k
变量是对程序中数 据 存储空间的抽象
指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量叫~
如 int static int a[5]={6,2,3}; a[5]; int a[]={1,2,3,4,5,6}; 等价于: a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0; 等价于: a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; 如 编译系统根据初值个数确定数组维数 int a[3]={6,2,3,5,1}; ()
a[0]
例 int a[3][4];
a[0] a[1] a[2] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[0][0] a[0][1] a[0][2] a[0][3]
行名
3 4 5 6 7 8
9 10 11
a[1]
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,„M‟,19, “200 Beijing Road”};
结构体变量的初始化形式二:
f为返回整型数的函数
p为返回指针的函数,该指针指向一个整型数据 p为指向函数的指针变量,该函数返回整型数 p为指针变量,它指向一个指向整型数据的指针变量
例题
有一个包含5个元素的数组,DispBuf[0], DispBuf[1], DispBuf[2], DispBuf[4], DispBuf[5],这些变量值分别为0x1001, 0x1002,0x1003, 0x1004, 0x1005,调试, 观察指针变量的基类型改变所带来的变化。 定义数组。用数码管显示数组内的数值
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
直接定义结构体变量
struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列; 用无名结构体直接定义 变量只能一次
指针变量p
例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }
指针与数组

指向数组元素的指针变量
例 int array[10]; int *p; p=&array[0]; // p=array; 或 int *p=&array[0]; 或 int *p=array; 数组名是表示数组首地址的地址常量

结构体
结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体--
----自定义数据类型 结构体类型定义
struct是关键字, 不能省略
struct [结构体名] { 类型标识符 成员名; 类型标识符 成员名; ……………. };
合法标识符 可省:无名结构体 成员类型可以是 基本型或构造型
表示元素个数 下标从0开始
a
0 1 2
3 数组名表示内存首地址, 4 是地址常量 5
a[0] a[1] a[2] a[3] a[4] a[5]
编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型)
一维数组的引用
数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整 个数组 数组元素表示形式: 数组名[下标] 其中:下标可以是常量或整型表达式
例子图解
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
num
2字节

name sex
20字节
1字节 2字节 4字节
age
score
…..
addr
30字节
结构体类型定义的作用域
一般形式:
例 struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
说明:
结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期
结构体类型定义描述结构 的组织形式,不分配内存
5.2 结构体变量的定义

先定义结构体类型,再定义结构体变量

一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 变量名表列;
定义结构体类型的同时定义结构体变量
一般形式: struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
指针
2000 …...
整型变量i
变量的 地址
2001 2002 2003 2004
10
变量的内容
2005
2006
2000
变量i_pointer 指针变量
指针变量 变量
变量地址(指针) 指向 变量值
…...
地址存入 指针变量
&与 *运算符 含义

含义: 取变量的地址 含义: 取指针所指向变量的内容 单目运算符 单目运算符 i_pointer 优先级: 2 优先级: 2 &i_pointer 2000 结合性:自右向左 结合性:自右向左
第5章 C51构造数据类型
数组
• 构造数据类型之一 • 数组:有序数据的集合,用数组名标识 • 元素:属同一数据类型,用数组名和下标确定
一维数组
一维数组的定义
定义方式: 例 int a[6];
合法标识符
[ ] :数组运算符 单目运算符 优先级(1) 左结合 不能用( )
数据类型
数组名[常量表达式];
\0
ch[0] ch[1] ch[2] ch[3] ch[4] ch[5]
字符数组

字符串及其结束标志

无字符串变量,用字符数组处理字符串 字符串结束标志:‘\0’
指针
C51程序设计中使用指针可以:ห้องสมุดไป่ตู้
使程序简洁、紧凑、高效
有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值
变量i_pointer
2000
指针变量
i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址
5.2 指针变量

指针变量与其所指向的变量之间的关系
i_pointer
2000 变量i 3 *i_pointer
i &i
i=3;
*i_pointer i_pointer
*i_pointer=3
指针变量的定义 一般形式: [存储类型]

数据类型 *指针名;
int *p1,*p2; 表示定义指针变量 float *q ; 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 不是‘ * ’运算符 static char *name; 注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
a[2]
每个元素a[i]由包含4个元素 的一维数组组成
5.3 字符数组和字符串
字符数组
定义 字符数组的初始化 逐个字符赋值 用字符串常量 字符数组的引用
逐个字符赋值 用字符串常量 有问题!
例例 char ch[5]={ „H‟,‟e‟,‟l‟,‟l‟,‟o‟ }; char ch[6]={ “Hello”}; char ch[6]=“Hello”; char H e ch[]=“Hello”; l l o ch[0]H ch[1]e ch[2]l ch[3]l ch[4]o
array[0] array[1] array[2] array[3]
p
array[9] 整型指针p &array[0]
...
指针的运算
如 int i, *p; p=1000; i=p;
() ( )
指针变量的赋值运算 p=&a; (将变量a地址p) p=array; (将数组array首地址p) p=&array[i]; (将数组元素地址p) p1=p2; (指针变量p2值p1) 不能把一个整数p,也不能把p的值整型 变量
5.3 结构体变量的引用

引用规则

结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
成员(分量)运算符 优先级: 1 结合性:从左向右
可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用
5.4 结构体变量的初始化

形式一:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 结构体变量={初始数据};
a[0][0] a[1][0] a[2][0]
a[0][1] a[1][1] a[2][1]
3 4 5
二维数组理解
二维数组a是由3个元素组成 0 1 2 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
不能用auto变量的地址 去初始化static型指针
指针变量必须先赋值,再使用
例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); }
危险!
…...
2000 2001 2002 2003 2004 2005 2006 …... 随机
整型变量i
10
指针变量与其指向的变量具有相同数据类型
指针的数据类型
定义 int i;
int *p; 定义整型变量i p为指向整型数据的指针变量 定义含n个元素的整型数组a n个指向整型数据的指针变量组成的指针数组p p为指向含n个元素的一维整型数组的指针变量 含义
int a[n];
int *p[n]; int (*p)[n]; int f(); int *p(); int (*p)(); int **p;
一维数组的初始化
初始化方式
int a[5]={1,2,3,4,5}; 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值 当全部数组元素赋初值时,可不指定数组长度
…... 2000 2001 2002
两者关系:互为逆运算 理解
*i_pointer 10 i
整型变量i
10
2003 2004
2005 2006 …...
i_pointer &i &(*i_pointer) i_pointer = &i = &(*i_pointer) i i = *i_pointer *(&i) *i_pointer = *(&i)
二维数组
二维数组的定义
定义方式: 数据类型 数组名[常量表达式][常量表达式]; 数组元素的存放顺序 原因:内存是一维的 二维数组:按行序优先 多维数组:最右下标变化最快
int a[3][2] 0 1 2 a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
指针变量的初始化
一般形式:[存储类型] 数据类型 *指针名=初始地址值;

int i; int *p=&i;

例 int i; int *p=&i; int *p=&i; int i; int *q=p;
赋给指针变量, 不是赋给目标变量 变量必须已说明过 类型应一致
用已初始化指针变量作初值
例 main( ) { int i; static int *p=&i; .............. } ( )
相关文档
最新文档