版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、指针的应用 通过指针访问数组元素 函数参数(函数通信) 在程序中使用动态内存(动态存储管理) 构造复杂数据结构 ,指针变量与一维数组的关系 以 int *p 与 int a10 为例 数组名可以看作是指针(地址)常量 数组元素的表示方法:下标法和指针法 即若p = a, 则 pi ai *(p+i) *(a+i),若p = a; 则p+i 是ai的地址,pi就是ai 若p = 则p+i是a3+i的地址,pi是a3+i,指针的算术运算 p+, p-, p+i, p-i, p+=i, p-=i等 若p1与p2指向同一数组,p1-p2为两指针间元素个数,任何情况下,指针 p1+p2 无意义,指针变量
2、的关系运算 若p1和p2指向的是同一个数组中的元素,则 p1p2 表示p1指的元素在后 p1= p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义 指针可以是空指针 赋值:p = NULL 比较:p = NULL或p != NULL,指针的应用 通过指针访问数组元素 函数参数(函数通信) 在程序中使用动态内存(动态存储管理) 构造复杂数据结构 ,指针作为函数的参数 一般情况下,函数调用发生时,是将实参的值传给形参,称为值传递或传值调用 引入指针后,可以将实参变量的地址传给形参,称为地址传递或引用调用,函数参数:实参将值传给形参值传递,void swap(int x,int
3、 y) int temp; temp = x; x = y; y = temp; int main() int a,b; scanf(%d,%d, ,5,9,5,5,9,COPY,值传递,运行时 输入为:5, 9 输出为:5,9,指针作为函数的参数 一般情况下,函数调用发生时,是将实参的值传给形参,称为值传递或传值调用 引入指针后,可以将实参变量的地址传给形参,称为地址传递或引用调用,void swap(int *p1, int *p2) int temp; temp = *p1; *p1 = *p2; *p2 = temp; int main() int a,b; scanf(%d,%d,
4、,.,0 x00132000,0 x00132010,0 x00132014,0 x00132004,0 x00132008,0 x0013200C,0 x00132018,0 x0013201C,0 x00132020,.,5,9,(main),0 x00132000,0 x00132004,5,9,运行时 输入为:5,9 输出为:9,5,地址传递,指针变量作为函数参数地址传递,9,5,(swap),void swap(int *p1, int *p2) int temp; temp = *p1; *p1 = *p2; *p2 = temp; int main() int a,b; scan
5、f(%d,%d, ,.,0 x00132000,0 x00132010,0 x00132014,0 x00132004,0 x00132008,0 x0013200C,0 x00132018,0 x0013201C,0 x00132020,.,5,9,(main),5,9,运行时 输入为:5,9 输出为:9,5,地址传递,特点:间接实现 “双向”传递,指针变量作为函数参数地址传递,数组名作函数参数 数组名作函数参数,是地址传递,void bubbleSort(int a, int n) /对n个整数进行冒泡排序 int i, j; int temp; for(i = 0; i aj+1) te
6、mp = aj; aj = aj+1; aj+1 = temp; /*end if*/ /*end for i*/ /*end of bubbleSort*/,#define ArrSize 1000 int main() int i,n; int numArrSize; void bubbleSort(int a, int n); void printArr(int a, int n); printf(number of elements(1000): ); scanf(%d, ,void printArr(int a, int n) /输出整型数组的元素 int i; for(i = 0;
7、 i n; i+) printf(%dt,ai); printf(nn); /*end of printArr*/,数组名作函数参数 数组名作函数参数,是地址传递 实参与形参的形式,int f(int x,int n) void main() int a10,*p=a; f(p,10); ,int f(int x,int n) void main() int a10; f(a,10); ,int f(int *x,int n) void main() int a10; f(a,10); ,int f(int *x,int n) void main() int a10, *p=a; f(p,10
8、); ,实参与形参均用数组,实参与形参均用指针变量,实参用指针变量,形参用数组,实参用数组,形参用指针变量,指针作为函数的参数 一般情况下,函数调用发生时,是将实参的值传给形参,称为值传递或传值调用 引入指针后,可以将实参变量的地址传给形参,称为地址传递或引用调用,从而可以通过参数带回函数中计算出的结果(数据)。,可以通过指针参数带回函数的计算结果,int f(int x, int y, int *p1, int *p2) *p1 = x * y; *p2 = x / y; return x + y; int main( ) int a, b, sum, product, quotient ;
9、 scanf(%d,%d, ,指针作为函数的参数 一般情况下,函数调用发生时,是将实参的值传给形参,称为值传递或传值调用 引入指针后,可以将实参变量的地址传给形参,称为地址传递或引用调用,从而可以通过参数带回函数中计算出的结果(数据)。,函数的返回值为指针 一般情况下,用return语句表示函数的返回值,局限是函数的返回值只能有一个 return 表达式; /表达式的值就是函数的返回值 引入指针后,函数可以返回指针类型的值,函数可返回一个指针(一个存储区域的首地址),因此可先将需要返回的所有数据放入所申请的存储区域,然后令函数返回该区域的首地址即可实现函数返回多个值的效果,这涉及到动态存储管理
10、的问题。,int main( ) int a, b, sum, product, quotient ; int *ptr; scanf(%d,%d, ,int* f(int x, int y) int *ip; ip = (int *)malloc(3*siezof(int); if ( NULL = ip ) return NULL; *ip = x + y; /ip0=x+y; *(ip+1) = x * y; /ip1=x*y; *(ip+2) = x / y; /ip2=x/y; return ip; ,指针的应用 通过指针访问数组元素 函数参数(函数通信) 在程序中使用动态内存(动态
11、存储管理) 构造复杂数据结构 ,什么是动态内存 内存布局,代码区,静态数据区 (全局和静态变量),栈区(stack),堆区(heap),文字常量区,#include #include int a; /全局变量 int func() static int b; /静态的局部变量 int c; /自动变量,局部的 char str20; / 局部数组 char *p = test; /自动变量p是局部的 /test是字符串常量 p = (char *)malloc(10*sizeof(char); return 0; ,由系统管理 (分配/回收),由程序员根据数据处理需要申请/释放,内存布局,代码
12、区,静态数据区 (变量),栈区(stack),堆区(heap),文字常量区,test,a的存储单元,b的存储单元,c的存储单元,通过malloc申请的 10个字符存储区,数组str的20个 字符存储区,p的存储单元,#include #include int a; /全局变量 int func() static int b; /静态的局部变量 int c; /自动变量,局部的 char str20; / 局部数组 char *p = test; /自动变量p是局部的 /test是字符串常量(文字常量) p = (char *)malloc(10*sizeof(char); return 0;
13、,在程序中使用动态存储区域 与动态内存有关的库函数 申请:malloc() 申请:calloc() 释放(归还):free() 申请:realloc(),malloc()函数 原型:void *malloc( size_t size ); 作用:从内存的堆区申请一块字节数为size的存储空间,返回值为所得到存储空间的首地址,若申请失败,则返回一个空指针(NULL) 例如: int *p; p = (int *)malloc(10*sizeof(int); if (NULL=p) /申请失败 char *q; q = (char *)malloc(100*sizeof(char); if (NU
14、LL=q) /申请失败,calloc()函数 原型: void* calloc( size_t num, size_t size ); 作用:从堆区申请存储空间,用于存储最多num个元素,每个元素占用size个字节,申请成功时将存储区域初始化为0,返回值为所申请存储区域的首地址(指针) 例如: int *p; p = (int *)calloc(10, sizeof(int); if (NULL=p) ,free()函数 原型:void free( void* ptr ); 作用:释放动态申请的存储空间(调用malloc或calloc或realloc函数所得到的存储空间),ptr是指针变量,其
15、值为之前所申请存储空间的首地址 例如: int *p; p = (int *)malloc(10*sizeof(int); free(p); char *q; q = (char *)calloc(100, sizeof(char); free(q);,realloc()函数 作用:重新申请存储空间 用法:实参是两个,一个是原空间的首地址,另一个是新空间的大小。 例如: int *p, *q; p = (int *)malloc(10*sizeof(int); q = (int *)realloc(p, (10+5)*sizeof(int); if (q) p = q;,指针的应用 通过指针访
16、问数组元素 函数参数(函数通信) 在程序中使用动态存储区域,构造动态数组,动态数组 空间大小可变、存储区域也可能变化的数组 用 malloc/calloc/realloc 函数实现 例如: int *p; unsigned int n = 100; p = (int *)malloc(n*sizeof(int); if ( NULL!= p ) for( i = 0; i; i+) pi = 2*i+1;,指针的应用 通过指针访问数组元素 函数参数(函数通信) 在程序中使用动态内存(动态存储管理) 构造复杂数据结构(后续课程讨论) ,指向结构体变量的指针,先定义结构体类型,再定义结构体变量(指针变量),struct Complex double real; double imag; ;,类型名:struct Complex 定义结构体变量(指针),例如 struct Complex a, *p;,typedef struct double real; double imag; COMPLEX;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年桐庐事业单位招聘考试模拟题及答案详解
- 2026年脲醛塑料项目安全调研评估报告
- 2026年青马工程考试模拟题及答案详解
- 企业信用报告-汇工(河北)机械集团有限公司
- 2026年商用车分析报告
- 2026年深圳公务员考试行政执法素质测试模拟题及答案详解
- 2026年航天地面卫星地面站操作员晋升模拟试题(含答案)
- 2026年下坡安全模拟题及答案详解
- 2026年初级会计职称考试会计实务点睛卷模拟试卷(含答案)
- 2026年人类挑战模拟题及答案详解
- 营地营运方案
- 市场法评估案例
- 管道工基础知识培训课件
- 随机信号处理教学大纲
- T/JSSES 39-2024水体中抗生素环境风险评估技术指南
- (高清版)DG∕TJ 08-2289-2019 全方位高压喷射注浆技术标准
- 九年级数学上册23.6.1用坐标确定位置课件华东师大版
- (正式版)JTT 382-2024 内河运输船舶评价指标
- (高清版)DZT 0004-2015 重力调查技术规范(150 000)
- 灯谜文化智慧树知到期末考试答案2024年
- 家风家训家规中国传统美德礼仪孝传承文化中国风国学课件下载两篇
评论
0/150
提交评论