清华c+语言程序设计:第07章 指针

上传人:tia****nde 文档编号:71173579 上传时间:2019-01-19 格式:PPT 页数:40 大小:405.31KB
返回 下载 相关 举报
清华c+语言程序设计:第07章 指针_第1页
第1页 / 共40页
清华c+语言程序设计:第07章 指针_第2页
第2页 / 共40页
清华c+语言程序设计:第07章 指针_第3页
第3页 / 共40页
清华c+语言程序设计:第07章 指针_第4页
第4页 / 共40页
清华c+语言程序设计:第07章 指针_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《清华c+语言程序设计:第07章 指针》由会员分享,可在线阅读,更多相关《清华c+语言程序设计:第07章 指针(40页珍藏版)》请在金锄头文库上搜索。

1、第7章 指针,讲授内容,指针的定义与运算 指针与数组的关系 字符串函数 指针与const限定符 传递指针参数 动态内存分配方法 函数指针,7.1 指针的定义,指针:具有确定属性的地址 属性决定了以该地址为起始地址的存储空间(数据单元)大小以及可以存放什么类型的数据 指针变量:可以存放指针的变量,7.1 指针的定义,char c = 7; char *chptr = ,7.1 指针的定义,指针变量声明 int *myPtr; 说明了一个指向int类型的指针变量myPtr int *myPtr1, *myPtr2, i, j; 可以说明指向任何数据类型的指针 指针变量声明时可以初始化为0,NULL

2、或某个地址 0 或 NULL: 不指向任何数据单元 (推荐使用NULL),7.2 指针的运算, 使 yPtr 指向 y,7.2 指针的运算,* (一元运算,间接引用运算符,其操作数表达式的值必须是指针),如 int *yPtr,y; yptr = ,7.2 指针的运算,* 和 ,例子1:指针的运算(&、*的应用示例),#include int main( ) int n; int *nPtr; n = 7; nPtr = ,7.2 指针的运算,指针的算术运算 指针变量可以自增/自减 (+或-) 指针可以加/减一个整数(+或+= ,-或-=) 同类型指针可以相减 一元运算符sizeof( ) 操

3、作数为变量名、类型名或常量 运算结果为操作数所需存储单元的字节数 特例:操作数为数组名时,结果为数组所需存储单元的总字节数 如 sizeof(int)、 sizeof(int *)均为4 声明int myArray10,*p=myArray;后 sizeof(myArray)为40、 sizeof(p)为4,7.2 指针的运算,Int v5, * vPtr = v ; / vPtr 为3000 vPtr += 2; / 赋值后 vPtr 为3008 把 vPtr的值当作整数和 n*sizeof(int)相加,得到vPtr + n的实际值(指向后续第n个数组元素),7.2 指针的运算,同类型指针

4、相减 int v5, * vPtr , * vPtr2; vPtr = / vPtr2 - vPtr 结果为 2. 把 vPtr2和vPtr的值当作整数相减后除以 sizeof(int)(两个指针间的数组元素个数),7.2 指针的运算,指针的关系运算 同类型指针可以进行各种关系运算 可以判断指针是否为 0或NULL 如 int v5, * vPtr , * vPtr2; vPtr = ,7.2 指针的运算,指针的赋值运算 同类型指针可以赋值 不同类型的指针之间的赋值必须进行强制类型转换 如 int * nPtr; float f=0.5,* fPtr= 特例:void类型的指针(类型 void

5、 *) 可以指向任何类型的数据 void *类型的指针不能被复引用 可以和其他类型的指针相互赋值,7.2 指针的运算,如 void * vPtr; float * fPtr; vPtr = fPtr; fPtr = vPtr; 但下面这种情况不行,必须进行类型的强制转换 void * vPtr; float * fPtr; int * iptr; vPtr = fPtr; iPtr = vPtr; /错误 iPtr = (int *)vPtr; /正确,例子2:指针运算例子,#include int main() char c = A, * pc; int ints5= 1,2,3,4,5,

6、*p1; int m = 6 , n = 7; int * p2, * p3; pc = ,例子2:指针运算例子,p1 += 4; printf(“After p1 += 4:tp1= %p t*p1 = %d n“, p1, *p1 ); p2 = ,程序运行结果,c= A pc = 0012FF7C *pc = A After pc += 5: pc = 0012FF81 p1= 0012FF64 *p1 = 1 After p1 += 4: p1= 0012FF74 *p1 = 5 p2= 0012FF5C *p2 = 6 p3= 0012FF58 *p3 = 7 p2 - p3= 1

7、p2 = p3,7.3 指针与数组,数组名是指向该数组第一个元素的常量指针 int b5, *bPtr; bPtr = b; /等价于bPtr = 注:C+编译器把形如指针表达式下标表达式的下标运算转化为表达式 *(指针表达式+下标表达式)即地址+偏移量的方式,7.3 指针与数组,指针数组数组元素可以是指针 如:int *array10,i; array5= suit 的每个元素是一个字符(char)指针 字符串中的字符并没有存放在数组中,数组中存放的是指向字符串的指针 suit 数组的元素数目是固定的,但字符串的长度可以不相等,7.3 指针与数组,指针数组suit的存储结构,7.4 常用字符

8、串处理函数 (库文件string.h),求字符串长度: int strlen(const char *s); 字符串拷贝: char* strcpy(char* dest, const char* src); 字符串连接: char* strcat(char* dest, const char* src); 字符串比较: int strcmp(const char* s1, const char* s2);,7.4 常用字符串处理函数 (库文件string.h),在字符串中查找字符: char* strchr(const char* s, int c); 在字符串中反向查找字符: char*

9、strrchr(const char* s, int c); 在字符串中查找字符串: char* strstr(const char* s1,const char* s2); 打断字符串: char *strtok(char *s, char *delim);,例子3:字符串处理函数strtok的应用,#include #include main( ) char s=“Hello C+ World“; char *d=“ “; char *p; p = strtok(s, d); while(p) printf(“%sn“, p); p = strtok(NULL, d); return 0;

10、 ,7.5 使用const限定符,最低访问原则良好的程序设计风格 可用于不允许被修改的变量和形式参数,数据保护 声明const变量时需要初始化 const int studNum = 100 ;,7.5 使用const限定符,指向常量数据的非常量指针 int i, j, *q; const int * p; p = / 不允许,7.5 使用const限定符,指向非常量数据的常量指针 int var1,var2 ; int * const p = / 错误!,7.5 使用const限定符,指向常量数据的常量指针 const int val = 10; const int *const p = /

11、 允许,7.5 使用const限定符,用于限定函数形式参数,以保护实参 void output(const double * pd) cout *pd ; / 允许 *pd = 15.5 ; / 不允许! 或 void output(const double / 不允许! ,7.6 指针和引用,指针和引用都可以实现通过一个变量访问另一个变量 int a; int *aptr = /修改了变量a,例子4:参数为指针的函数,#include void swap(int *, int *); int main() int x = 10, y = 20; swap( ,例子5:用指针实现冒泡排序函数,

12、void swap(int * a, int * b) int temp; temp = *a; *a = *b; *b = temp; void bubbleSort(int *array, int size) int pass, j; for ( pass=0; passsize-1; pass+ ) for(j=0; j size-pass-1; j+ ) if ( arrayj arrayj+1 ) swap( ,7.7 动态内存分配,静态内存分配 声明变量, 编译时可以确定所需内存空间大小 栈式分配 动态内存分配 编译时可以确定所需内存空间大小,运行时分配 通过malloc函数或运算

13、符new实现 和malloc函数对应的释放内存函数是free 和new对应的释放内存运算符是delete 有可能分配不成功 堆式分配,7.7 动态内存分配,使用函数malloc和函数free void *malloc(unsigned size); 例如: int *p=(int *)malloc(sizeof(int); (*p )+; int* score=(int*)malloc(sizeof(int)*10); if(score != NULL ) for(int j=0; j score j ; void free(void *ptr); 如:free(p); free(score)

14、;,7.7 动态内存分配,使用new和delete运算符 new运算符 int *p= new int ; (*p )+; int * score= new int10; for(int j=0; j scorej; 使用delete运算符释放内存,如 delete p ; delete score ;,例子6:对运行时指定数目的整数进行排序,#include #include void sortArray ( int , int ); void displayArray( int , int ); int main() int * a; int i, num; cout num; a = n

15、ew int num; if (a = NULL) cout “malloc error! exit.“ endl; return 1; ,例子6:对运行时指定数目的整数进行排序,for ( i = 0; i ai; sortArray ( a, num ); cout “After sorting:“ endl; for (i = 0; i num; i + ) cout ai “ “; cout endl ; delete a ; return 0; ,例子6:对运行时指定数目的整数进行排序,void sortArray( int b , int len ) for (int pass=0; pass b i ) int hold = b pass ; b pass = b i ; b i = hold; ,学习目的检测,理解指针的概念 掌握传递指针参数的机制 理解指针、数组与字符串之间的关系 掌握内存分配和释放的方法 了解指针函数的作用,作业,7.2, 7.4, 7.9, 7.10 上机:7.6, 7.12, 7.13,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号