第13章 指针的使用.ppt_第1页
第13章 指针的使用.ppt_第2页
第13章 指针的使用.ppt_第3页
第13章 指针的使用.ppt_第4页
第13章 指针的使用.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1、第10章 指针的使用,主讲教师:郑立垠,计算机与通信工程学院 计算机应用技术系,本章主要内容,地址与指针的概念 指针变量的定义与使用 一维数组与指针的关系 指针的应用,问题的提出,变量的三个要素:,问题: 数据存储在什么位置? 数据在内存中是如何存取的?,标识符 空间大小 存储内容,变量名称: 数据类型: 变量的值:,地址与指针的概念,在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(位),它们都有一个编号,这个编号就是内存地址。,一、地址:,注意: 1、程序中定义的每个数据在编译后都占有各自的内存区。 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第1个单元的地

2、址,地址与指针的概念,二、变量与地址:,如定义: char c=A; int k;,01000001,k,编译或函数调用时为其分配内存单元,地址,注意:c和k的地址可能相邻,也可能不相邻,是由系统分配的,编程人员不用关心。,变量是对程序中数据 存储空间的抽象,地址与指针的概念,三、指针与指针变量:,指针:在C语言中,将变量的地址形象化地称为指针。 指针变量:专门存放变量地址的变量,2000,指针,指针变量,变量i的内容,变量i的地址,指针变量i_pointer 指向整型变量 i,地址与指针的概念,指针与指针变量的关系:,指针变量 i_pointer,变量i,变量值,指向,地址存入 指针变量,变

3、量i地址,变量与指针,一、指针变量的定义 一般形式: 类型说明 * 指针变量名;,指针变量指向的变量的数据类型,指针说明符 表示定义指针变量,例如: int *p1,*p2; float x, *q; char *c;,注意: 指针变量定义后,其内容不确定,应用前必须先赋值,变量与指针,二、指针变量的赋值 用变量的地址给指针变量赋值 (求地址运算符 则 s= p = ,如: int a, *p1, *p2; p1 = ,如: int *p; p = NULL;,注意:下面赋值是非法的 int a,*p; p=2000; a=p;,表示空指针,即不指向任何单元,在头文件stdio.h中定义。 d

4、efine NULL 0,变量与指针,三、指针变量的初始化 格式: 类型说明 * 指针变量名=初始地址;,例 int a,*p=,变量必须已定义且类型应一致,例 int a; int *p=,用已初始化过的指针变量作初值,例 int *p=,变量与指针,四、指针变量的引用 1、两个运算符: 2)作为取内容运算符,作用于指针变量 b=*p a 3)作为乘法运算符,用于两个数相乘 5*8,变量与指针,#include int main() int a,b, *p_1 = ,变量与指针,若有: int a=5, *p= 则 (1) (2) . while(p!=NULL) . ,变量与指针,关于指针

5、的增减运算,比如假设 int *p1; p1= return 0; ,变量与指针,五、变量的存取方式:,直接访问:通过变量本身对变量进行存取的方式。 间接访问:通过指针变量实现对变量的访问方式。 间接访问的过程是:由指针变量得到变量的地址,根据该地址找到变量的存储区,再对该存储区的内容进行存取,从而实现了对变量的间接访问,int a,*p= /*间接访问,结果a的值为20 */,变量与指针,找出具有等价关系的式子。 int a=5, *p= int *p1,*p2,*p; p1=,p1, int *p1,*p2; p1=,p1, int *p1 = ,变量与指针,【例4】用指针实现求1100的

6、累加和,#include int main( ) int i, sum=0; int *p1 = ,int i, sum=0; for( i=1; i=100; i+ ) sum = sum + i; printf( 1+2+.+100=%dn, sum );,一维数组与指针,一、一维数组的地址 数组名是表示数组首地址, 即第一个数组元素的地址,a for(i=0; i5; i+) printf(%d n, *(a+i) ); ,一维数组与指针,二、指向数组元素的指针变量 如定义:int a10, *p = a; 则: p= 若令:p = 则: p= 若令:p = for(i=0; i5; i

7、+) printf(%d , *(a+i) ); printf(n); /*地址法*/ for (p=a; pa+5; p+) printf(%d , *p); printf(n); /*指针法*/ ,*a+,注意:p是指针变量,取值可变,可指向各个数组元素 a是数组名,是地址(指针)常量,其值不可变,一维数组与指针,三、指向数组元素的指针的算术运算 如定义:int a10, *p = a, *q=a;,一维数组与指针,四、数组元素的引用方法 (1)下标法:如ai形式; (2)指针法:如*(a+i)或 *(p+i)。 如定义:int a5, *p = a;,通过改变p的值,也可使p指向任意数组

8、元素,一维数组与指针,四、数组元素的引用方法,#include int main() int a5=1,2,3,4,5,*p=a,i; for(i=0;i5;i+) printf( a%d:%dn,i, ai); for(i=0;i5;i+) printf(*(a+%d):%dn,i,*(a+i); for(i=0;i5;i+) printf( *(p+%d): %dn,i, *(p+i); for(p=a,i=0;pa+5;p+,i+) printf( pa%d: %dn,i, *p); return 0; ,更常用方法,常用,直观,一维数组与指针,注意指针变量的运算,设指针p指向数组a(p

9、=a),则: p+(或 p += 1), *(p+)与*(+p)的作用不同 *(p+):相当于*p+, *(+p): (*p)+表示, 如果p当前指向数组a的第i个元素,则: *(p-)相当于ai-, *(+p)相当于a+i, *(-p)相当于a-i,,p指向下一个元素,先取*p,再使p加1,先使p加1,再取*p,p指向的元素值加1,先取*p,再使p减1,先使p加1,再取*p,先使p减1,再取*p,理解, 不倾向于 使用,一维数组与指针,例:int a =1,2,3,4,5,6,7,8,9,10,*p=a,i=5; 选择:数组元素地址的正确表示:(A) int y,*p= ,6,y=5,5 6

10、,例:指出程序输出结果,一维数组与指针,例 :指出程序中的错误,设a =5,8,7,6,2,7,3;,int main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+) printf(%2d,*p+); printf(n); ,p=a; /* 恢复指针p */,p+i?,一维数组与指针,【例1】用指针实现将数组倒置,/*用下标变量实现*/ #include #define N 5 int main() int aN=5, 4, 3, 2, 1; int i=0 , j=N-1 , t ; whi

11、le( ij ) t= ai; ai = aj; aj = t; i+; j-; for( i=0; iN; i+ ) printf( “%5dn, ai ); ,/*用指针实现*/ #include #define N 5 int main() int aN=5, 4, 3, 2, 1; int *p = a, *q = a+N-1; int i, t; while( pq ) t = *p; *p = *q; *q = t; p+; q-; for( p=a, i=0; iN; i+ ) printf( %5dn, *p+ ); ,二维数组与指针,一、二维数组的地址 例如:int a34;

12、 1、二维数组名a是数组的首地址 2、数组a包含3行,即三个行元素:a0, a1, a2。 a,a+1,a+2分别代表三个行元素的地址 而a0, a1, a2既是一维数组名,也是地址量 a0代表第0行第0列元素的地址,即 其元素a0、a1、aM-1是一维数组名, 所以ai+j是数组元素aij的地址 元素aij的地址可以表示为下列形式: int i,j,*q= ,q = p=a+1; /p指向数组的第二行,二维数组与指针,【例3】有一整形数组a34,利用指针输出各元素的值。 /chap7ex2.c #include #define M 3 #define N 4 int main() int a

13、MN=1,2,3,4,5,6,7,8,9,10,11,12,(*q)N; int i,j; q=a; for(i=0;iM;i+) for(j=0;jN;j+) printf(%-5d,*(*(q+i)+j); printf(n); return 0; ,二维数组与指针,六、指向指针的指针变量 如果指针的值是另一指针的地址,则该指针是指针的指针。定义为: 类型说明 *指针变量名; #include int main() int x = 3, *p1= ,理解,二维数组与指针,七、指针数组 如果数组的每个元素都是指针,则该数组为指针数组。 定义为: 类型说明 *数组名数组长度 #include

14、int main() int i, x5 = 1, 2, 3, 4, 5; int *p5;/* p为指针数组*/ for(i=0; i5; i+) pi = ,指针应用举例,#include #define N 10 int main() int i, aN, *p, *pMax; printf(输入%d个整数:,N); for(p=a; p*pMax) pMax=p; i=pMax-a+1; printf(第%d个数最大,为%dn, i, *pMax); return 0; ,【例1】 设有10个整数的数组中,求最大数的位置,指针应用举例,【例2】输入10个数,用选择法由小到大排序并输出,

15、#include #define N 10 int main () int i, j, t, aN; printf(顺序输入%d个整数: , N) ; for(i=0; iaj) t=ai; ai=aj; aj=t; printf(n排序后的序列为:n); for(i=0; iN; i+) printf( %d, ai); printf(n); return 0; ,下标法,排序实现,指针应用举例,#include #define N 10 int main() int aN, *p1, *p2, *pMin, t; printf(输入%d个整数:,N); for( p1=a; p1a+N;

16、p1+ ) scanf( %d, p1); for( p1=a; p1a+N-1; p1+ ) pMin = p1; for( p2=p1+1; p2a+N; p2+ ) if( *p2 *pMin ) pMin = p2; t = *pMin; *pMin = *p1; *p1 = t ; printf(排序后:); for( p1=a; p1a+N; p1+ ) printf(%d , *p1); return 0; ,指针法,指针应用举例,【例3】求二维数组aMN中最大元素及所在的行和列,分析: 对于有M行N列的二维数组,根据数组元素的存储顺序可知,设数组中的第k个元素为aij,若第1个

17、元素的位置为0,则k=N*i+j,从而有 i=k/N,j=k-i*N=k%N,这里i、j都是整数,指针应用举例,#include #define M 3 #define N 4 int main() int i, j, aMN, *p, *pMax; printf(请按行输入%dx%d数组的各个元素:n, M, N); for( p = ,内存的动态分配,C语言所提供的有关函数有3个,即malloc函数、calloc函数和free函数。 1、malloc函数 malloc函数的使用方法是: 指针=(类型说明 *)malloc(数据长度) 其中,“(类型说明 *)”是强制类型转换,以保证与指针的类型一致。“数据长度”为一正整数,表示数据所占内存单元个数字节数,常用sizeof()运算符来获取。malloc函数的函数值为成功分配的内存单元的地址,若分配内存失败则返回空指针NULL。 例如, int *p; p = (int *)malloc( sizeof(int) ); *p=3;,内存的动态分配,2、calloc函数 calloc函数的使用方法是: 指针=(类型说明 *)calloc(数据个数, 数据长度) 与malloc函数不同的是,calloc函数可分配若干个数据所占据的连续空间,因此

温馨提示

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

评论

0/150

提交评论