C语言中的指针与结构体_第1页
C语言中的指针与结构体_第2页
C语言中的指针与结构体_第3页
C语言中的指针与结构体_第4页
C语言中的指针与结构体_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c c 语言中的指针与语言中的指针与 结构体结构体 指针指针的概念的概念 地址地址 内容内容 变量名变量名 int x = 20, y = 1, z = 155; int *p; p= 1000 20 x 1002 1 y 1004 155 z 2000 1000 p 2002 指针变量指针变量 指针变量指针变量:存放地址的变量:存放地址的变量 某个某个变量变量的地址的地址 指向指向 (内存单元内存单元) 指针变量所指向的变量的类型指针变量所指向的变量的类型 int *p; p 是整型指针,指向整型变量是整型指针,指向整型变量 float *fp; fp 是浮点型指针,指向浮点型变量是浮点型指

2、针,指向浮点型变量 char *cp; cp 是字符型指针,指向字符型变量是字符型指针,指向字符型变量 类型名类型名 * 指针变量名指针变量名 指针声明符指针声明符 指针变量的定义指针变量的定义 取地址运算取地址运算( p = 把把 a 的地址赋给的地址赋给 p,即,即 p 指向指向 a /指针变量的类型和它所指向变量的类型相同指针变量的类型和它所指向变量的类型相同 a 3 定义定义指针变量指针变量 p *p =10; 指针指针p所指所指向向的变量的变量,即,即a,改变变量值,改变变量值 (3) p = 赋值运算赋值运算 a 3 p1 = /把把 a 的地址赋给的地址赋给 p1,即,即 p1

3、指向指向 a p2 = p1; /p2 也指向也指向 a /相同类型的指针才能相互赋值相同类型的指针才能相互赋值 注意:注意: 指针指针变量必须初始化。变量必须初始化。 void main () int a=1, b=2 , *p1 , *p2 , *pt; p1 = p2 = printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); pt = p1; p1 = p2; p2 = pt; printf (“a=%d, b=%d, *p1=%d, *p2=%dn”, a, b, *p1, *p2); return 0; p1 b 2 b = 2;

4、 *p1 = 1, *p2 = 2 a = 1; b = 2; *p1 = 2, *p2 = 1 指针指针作为函数参数作为函数参数 void swap (int *px, int *py) int t; t = *px; *px = *py; *py = t; 要通过函数调用来改变主调函数中某个变量的值:要通过函数调用来改变主调函数中某个变量的值: (1) 在主调函数中,在主调函数中,将该变量的地址或者指向该变量的将该变量的地址或者指向该变量的 指针作为实参指针作为实参 (2) 在被调函数中,在被调函数中,用指针类型形参接受该变量的地址用指针类型形参接受该变量的地址 (3) 在被调函数中,改变

5、形参所指向变量的值在被调函数中,改变形参所指向变量的值 a b pxpy 1221 / swap ( 数组和地址间的关系数组和地址间的关系 int a100, *p; 数组名代表一个地数组名代表一个地 址,它的值是数址,它的值是数 组首元素的地址组首元素的地址 (基地址)(基地址) a+i 是距数组是距数组a的的 基地址的第基地址的第i个偏个偏 移移 3000 a0 地址地址 内容内容 数组元素数组元素 3002 a1 3198 a99 ai a a+1 a+99 a+i for(i = 0; i 100; i+) sum = sum + ai ;*(a+i) 下标运算符下标运算符 的含义的含

6、义 任何由数组下标来实现的操作都能用指针来完成任何由数组下标来实现的操作都能用指针来完成 int a100, *p; p = a; 或或 p = p p+1 p+99 p+i 3000 a0 地址地址 内容内容 数组元素数组元素 3002 a1 3198 a99 ai a a+1 a+99 a+i sum = 0; for(i = 0; i 100; i+) sum = sum + pi; 等价等价 等价等价 *(p+i) sum = 0; for(p = a; p ”访问指针指向的结构成员。访问指针指向的结构成员。 p-age = 26; 当当p = (*p).age = 26; p-age

7、 = 26; 结构体指针作为函数参数结构体指针作为函数参数 当结构指针作为函数的参数时,执行效率高,当结构指针作为函数的参数时,执行效率高, 可以完成比基本类型指针更为复杂的操作。可以完成比基本类型指针更为复杂的操作。 例:输入例:输入10个学生的学号、姓名和成绩,输个学生的学号、姓名和成绩,输 出学生的成绩等级和不及格人数。出学生的成绩等级和不及格人数。 每个学生的记录包括学号、姓名、成绩和等级每个学生的记录包括学号、姓名、成绩和等级 要求定义和调用函数要求定义和调用函数set_grade根据学生成绩设置等级,根据学生成绩设置等级, 并统计不及格人数并统计不及格人数 等级设置:等级设置: a

8、 :85100;b:7084;c:6069;d:059 源程序源程序 #define n 10 struct student int num; char name20; int score; char grade; ; int main(void) int count; struct student stun, *ptr; ptr = stu; /* 输入输入 略略 */ count = set_grade( ptr ); int set_grade(struct student * p) int i, n = 0; for(i = 0; i score = 85) p-grade = a;

9、else if(p-score = 70) p-grade = b; else if(p-score = 60) p-grade = c; else p-grade = d; n+; return n; 调用调用set_grade返回主函数后,主函数中结构体数组返回主函数后,主函数中结构体数组stu的的 元素的元素的grade成员已经被赋值成员已经被赋值. 与结构体变量作为函数参数相比,用结构体指针作为函数参与结构体变量作为函数参数相比,用结构体指针作为函数参 数的效率更高,因而是更好的选择。数的效率更高,因而是更好的选择。 多文件结构多文件结构 工作区工作区 工程工程1工程工程2工程工程n

10、头文头文 件件 源文源文 件件 例:例:vc中的多文件结构中的多文件结构 示例示例 #include #include #include #include /常量定义常量定义 #define list_init_size 100 #define listincrement 10 #define ok 1 #define error 0 #define overflow -2 #define true 1 #define false 0 /函数返回值类型定义函数返回值类型定义 typedef int status; /表节点数据类型定义表节点数据类型定义 typedef int elemtype

11、; /顺序表类型定义顺序表类型定义 typedef struct elemtype *elem; int length; int listsize; sqlist; /顺序表各操作声明顺序表各操作声明 status initlist_sq(sqlist status detroylist_sq(sqlist status clearlist_sq(sqlist int listempty_sq(sqlist l); int listlength_sq(sqlist l); status getelem_sq(sqlist l,int i,elemtype status listinsert_s

12、q(sqlist status listdelete_sq(sqlist void printlist_sq(sqlist l); 头文件:头文件:sqlist.h #include sqlist.h /各操作的实现各操作的实现 status initlist_sq(sqlist if (!l.elem) exit(overflow); l.length=0; l.listsize=list_init_size; return ok; status detroylist_sq(sqlist return ok; status clearlist_sq(sqlist l.listsize=0;

13、return ok; 源文件:源文件:sqlist.cpp int listempty_sq(sqlist l) return (l.length=0); int listlength_sq(sqlist l) return l.length; status getelem_sq(sqlist l,int i,elemtype e=l.elemi-1; return ok; status listinsert_sq(sqlist if (il.length+1) return error; if (l.length=l.listsize) newbase = (elemtype *)reall

14、oc(l.elem,(l.listsize+listincrement)*sizeof(elemtype); if (!newbase) exit(overflow); l.elem=newbase; l.listsize+=listincrement; q= for (p=p=q;p-) *(p+1)=*p; *q=e; l.length+; return ok; status listdelete_sq(sqlist if (il.length) return error; p= e=*p; q=l.elem+l.length-1; for (+p;pq;+p) *(p-1)=*p; l.

15、length-; return ok; void printlist_sq(sqlist l) int i; if (l.length=0) cout该表为空该表为空endl; else for (i=0;il.length;i+) coutl.elemi ; #include sqlist.h void main() sqlist l; int i,num; cout创建顺序表创建顺序表endl; if (!initlist_sq(l) cout表创建失败表创建失败; /创建空顺序表创建空顺序表l else /产生各节点产生各节点 srand(time(null); for (i=0;i10;i+) /产生产生10个整数,插入顺序表表尾个整数,插入顺序表表尾 num = rand() % 100; listinsert_sq(l,i+1,(elemtype)num); 源文件:源文件:sqdemo.cpp ( 包含主函数包含主函数main() ) /输出原始顺序表的各个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论