C语言的指针和结构体-文档资料_第1页
C语言的指针和结构体-文档资料_第2页
C语言的指针和结构体-文档资料_第3页
C语言的指针和结构体-文档资料_第4页
C语言的指针和结构体-文档资料_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

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

2、量char *cp; cp 是字符型指针,指向字符型变量是字符型指针,指向字符型变量类型名类型名 * 指针变量名指针变量名指针声明符指针声明符指针变量的定义指针变量的定义4取地址运算取地址运算(&)和间接访问运算和间接访问运算(*)* :间接访问运算符间接访问运算符,访问指针所指向的变量。,访问指针所指向的变量。 *p:指针变量:指针变量 p 所所指向的指向的变量变量。a3&ap*p如果指针的值是某个变量的地址,通过指针就如果指针的值是某个变量的地址,通过指针就能能间接访问间接访问那个变量。那个变量。& : 取地址运算符取地址运算符,给出变量的地址。,给出变量的地址。i

3、nt *p, a = 3;p = &a; 把把 a 的地址赋给的地址赋给 p,即,即 p 指向指向 a/指针变量的类型和它所指向变量的类型相同指针变量的类型和它所指向变量的类型相同5a3&ap*p(1) 当当 p = &a 后,后,*p 与与 a 相同相同(2) int *p; 定义定义指针变量指针变量 p *p =10; 指针指针p所指所指向向的变量的变量,即,即a,改变变量值,改变变量值(3) &*p 与与 &a 相同,相同,是是地址地址 *&a 与与 a 相同,相同,是是变量变量(4) (*p)+ 等价于等价于 a+ 将将 p 所指所指向向

4、的变量值加的变量值加1 *p+ 等价于等价于 *(p+) /先取先取 *p,然后,然后 p 自加自加,此时此时p不再指向不再指向a说明说明 int a = 3, *p;p = &a;6赋值运算赋值运算a3&ap1&ap2*p1 *p2int a = 3, *p1, *p2;p1 = &a; /把把 a 的地址赋给的地址赋给 p1,即,即 p1 指向指向 ap2 = p1; /p2 也指向也指向 a/相同类型的指针才能相互赋值相同类型的指针才能相互赋值7注意:注意: 指针指针变量必须初始化。变量必须初始化。void main () int a=1, b=2 , *

5、p1 , *p2 , *pt; p1 = &a ; p2 = &b; 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;p1b2&bp2*p2a1&a*p1ptb2&ap2*p1a1&bp1*p2pt&aa = 1; b = 2; *p1 = 1, *p2 = 2a = 1; b = 2; *p1 =

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

7、p (&a, &b);9数组和地址间的关系数组和地址间的关系int a100, *p;数组名代表一个地数组名代表一个地址,它的值是数址,它的值是数组首元素的地址组首元素的地址(基地址)(基地址)a+i 是距数组是距数组a的的基地址的第基地址的第i个偏个偏移移3000 a0地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+i&ai*(a+i) sum = 0;for(i = 0; i 100; i+) sum = sum + ai ;*(a+i)下标运算符下标运算符 的含义的含义10任何由数组下标来实现的操作都能用指针来完成任何

8、由数组下标来实现的操作都能用指针来完成int a100, *p;p = a;或或p = &a0; pp+1p+99p+i3000 a0地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+i&ai aia+i *(a+i)p+i *(p+i)&pi pip = a;sum = 0;for(i = 0; i 100; i+) sum = sum + pi;等价等价等价等价*(p+i)sum = 0;for(p = a; p ”访问指针指向的结构成员。访问指针指向的结构成员。p-age = 26;当当p = &friend1时

9、,以下三条语句相同:时,以下三条语句相同: friend1.age = 26; (*p).age = 26; p-age = 26;30结构体指针作为函数参数结构体指针作为函数参数当结构指针作为函数的参数时,执行效率高,当结构指针作为函数的参数时,执行效率高,可以完成比基本类型指针更为复杂的操作。可以完成比基本类型指针更为复杂的操作。例:输入例:输入10个学生的学号、姓名和成绩,输个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。出学生的成绩等级和不及格人数。 每个学生的记录包括学号、姓名、成绩和等级每个学生的记录包括学号、姓名、成绩和等级 要求定义和调用函数要求定义和调用函数set_

10、grade根据学生成绩设置等级,根据学生成绩设置等级,并统计不及格人数并统计不及格人数 等级设置:等级设置:A :85100;B:7084;C:6069;D:05931源程序源程序#define N 10struct 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) i

11、nt i, n = 0; for(i = 0; i score = 85) p-grade = A; 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成员已经被赋值成员已经被赋值. 与结构体变量作为函数参数相比,用结构体指针作为函数参与结构体变量作为函数参数相比,用结构体指针作为函数参数的效率更高,因而是更好的选择。数的效

12、率更高,因而是更好的选择。32多文件结构多文件结构工作区工作区工程工程1工程工程2工程工程n头文头文件件源文源文件件 例:例:VC中的多文件结构中的多文件结构33示例示例#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;/表节点数据类

13、型定义表节点数据类型定义typedef int ElemType;/顺序表类型定义顺序表类型定义typedef structElemType *elem;int length;int listsize; SqList;/顺序表各操作声明顺序表各操作声明Status InitList_Sq(SqList &L);Status DetroyList_Sq(SqList &L);Status ClearList_Sq(SqList &L);int ListEmpty_Sq(SqList L);int ListLength_Sq(SqList L);Status GetElem

14、_Sq(SqList L,int i,ElemType &e);Status ListInsert_Sq(SqList &L,int i,ElemType e);Status ListDelete_Sq(SqList &L,int i,ElemType &e);void PrintList_Sq(SqList L);头文件:头文件:SqList.h34#include SqList.h/各操作的实现各操作的实现Status InitList_Sq(SqList &L)L.elem=(ElemType *)malloc(LIST_INIT_SIZE*siz

15、eof(ElemType);if (!L.elem) exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;return OK;Status DetroyList_Sq(SqList &L)if (L.elem) free(L.elem);return OK;Status ClearList_Sq(SqList &L)if (L.elem)L.length=0;L.listsize=0;return OK;源文件:源文件:SqList.cpp35int ListEmpty_Sq(SqList L)return (L.length

16、=0);int ListLength_Sq(SqList L)return L.length;Status GetElem_Sq(SqList L,int i,ElemType &e)if (i=L.length)return ERROR;e=L.elemi-1;return OK;36Status ListInsert_Sq(SqList &L,int i,ElemType e)ElemType *newbase,*p,*q; if (iL.length+1)return ERROR;if (L.length=L.listsize)newbase = (ElemType *)

17、realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType); if (!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; q=&(L.elemi-1);for (p=&L.elemL.length-1;p=q;p-)*(p+1)=*p;*q=e;L.length+;return OK;37Status ListDelete_Sq(SqList &L,int i,ElemType &e)ElemType *p,*q; if

18、 (iL.length)return ERROR;p=&(L.elemi-1);e=*p;q=L.elem+L.length-1;for (+p;pq;+p)*(p-1)=*p;L.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 ;38#include SqList.hvoid main()SqList L;int i,num;cout创建顺序表创建顺序表endl;if (!InitList_Sq(L)cout表创建失败表创建失败; /创建空顺序表创建空顺序表Lelse/产生各节点产生各节点srand(time(NULL);for (i=0;i10;i+) /产生产生10个整数,插入顺序表表尾个整数,插入顺序表表尾 num = rand() % 100;ListInsert_Sq(L,i+1,(ElemType

温馨提示

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

评论

0/150

提交评论