C语言指针与数组教程.ppt_第1页
C语言指针与数组教程.ppt_第2页
C语言指针与数组教程.ppt_第3页
C语言指针与数组教程.ppt_第4页
C语言指针与数组教程.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第9章 指针,主讲教师:孙运雷 计算机与通信工程学院 计算机科学系 sunyunlei教学要求,理解地址与指针的概念 熟悉指针变量的定义与使用 理解数组与指针的关系 P27利用指针返回多个值 了解指针的应用,本章主要内容,引子,swap函数的例子 值传递:修改的只是副本 那么传地址可行么?,#include void swap ( int a, int b) int temp = a; a = b; b = temp; int main ( ) int a = 3, b = 6; swap(a, b); ,传地址,swap(,问题: 思路可行否? 怎么改? 1)swap函数形参 2)如何根据地址取到值?,#include void swap ( int x, int y ) printf(“调用时:x地址为:%p, 值为:%dn“, ,void swap ( int *x, int *y ) printf(“调用时:x地址为:%p, 值为:%dn“,x,*x); printf(“调用时:y地址为:%p, 值为:%dn“,y,*y); int temp; temp = *x; *x = *y; *y = temp; ,变化: 1)形参用*表示传递了地址! 2)x和y是地址类型 3)从地址取值用了*操作符,本章主要内容,地址与指针的概念,一、地址 在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(bit),它们都有一个编号,这个编号就是内存地址。,提示: 1、程序中的执行代码和变量在执行前都在内存里保存。 2、数据所占有的存储单元个数是由其类型决定的。 3、首地址:第1个单元(0号)的地址,如定义: char c=A; int k;,01000001,k,编译或函数调用时为其分配内存单元,地址,注意:c和k的地址可能相邻,也可能不相邻,是由系统分配的,编程人员不用关心。,变量是对程序中数据 存储空间的抽象,二、变量与地址的关系,三、指针与指针变量,指针:在C语言中将变量的地址形象化地称为指针。 指针变量:专门存放变量地址的变量,2000,指针,指针变量,变量i的内容,变量i的地址,指针变量i_pointer 指向整型变量 i,指针变量 i_pointer,变量i,变量值,指向,地址存入 指针变量,变量i地址,四、指针与指针变量的关系,本章主要内容,前瞻(变量应用三阶段,定义、初始化+引用),定义 int *aPointer; 初始化 int *aPointer; aPointer = NULL; /空指针,其实是0 或者合并: int *aPointer = NULL; 引用 int a = 3, b = 6, tmp; int *pa = NULL, *pb = NULL; pa = ,指针就是“标着门牌号的钥匙” 用“&”记录了地址 用“*”当钥匙,使用指针时“*”有两个作用: 定义时:标志一下,这是个指针 引用时:从该地址取出值,一、指针变量的定义,一般形式: 类型说明 * 指针变量名;,指针变量指向的变量的数据类型,指针说明符 * 表示定义指针变量,例如: int *p1,*p2; float x, *q; char *c;,注意: 指针变量定义后,其内容不确定,应用前必须先赋值,如: int a, *p; p = ,如: int a, *p1, *p2; p1 = ,如: int *p; p = NULL;,表示空指针,即不指向任何单元,在头文件stdio.h中定义 define NULL 0,二、指针变量的赋值,用变量的地址给指针变量赋值 (使用求地址运算符,变量必须已定义且类型应一致,用已初始化过的指针变量作初值,三、指针变量的初始化,格式: 类型说明 * 指针变量名=初始地址; 例 int a,*p=,【示例1】本例输出结果?,#include int main() int a,b, *p_1= ,【示例2】分析语句,若有: int a=5, *p= 则 (1) a *p &a p a=3 *p=3 (2) &与*互为逆运算 &(*p) p *(&a) a (3) (*p)+ a+,【示例3】指针变量可以进行的操作,1)赋值: int a,*p1= 5)比较: 通常与指针常量NULL进行比较,两指针变量值的大小比较往往是无意义的。,【示例4】关于指针的增减运算,假设&a1=0x28ff18,#include int main( ) int a1=3; int *p1; p1= ,28ff18 28ff1c,变量的存取方式,直接访问:通过变量本身对变量进行存取的方式。 间接访问:通过指针变量实现对变量的访问方式。 间接访问的过程是: 由指针变量得到变量的地址,根据该地址找到变量的存储区,再对该存储区的内容进行存取,从而实现了对变量的间接访问,int a,*p= /*间接访问,结果a的值为20 */,【示例5】找出具有等价关系的式子,int a=5, *p= &*p *&a (*p)+ &a a *p+ *(p+) a+,【示例6】读程序写结果,#include int main() int a=2,*p= ,2 2 2 3,【例1】使两个指针变量交换指向,#include int main( ) int a1=11,a2=22; int *p1,*p2,*p; p1= ,p1,&a1,11,22,a1,p2,a2,&a2,*p1,*p2,&a1,&a2,【例2】通过指针变量交换其所指向的变量的值,#include int main( ) int a1=11,a2=22,t; int *p1,*p2; p1= ,p1,&a1,11,22,a1,p2,a2,&a2,22,11,t,11,*p2,*p1,【例3】用指针实现求1100的累加和,#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);,【例4】用指针实现求10个数的和,#include int main() int i, x, sum; int *p1 = ,【例5】用指针实现求10个整数的累加和及平均值(用函数返回这两个值),#include #define N 10 int fun(int x,int m,double *avg); int main() int a=1,2,3,4,5,6,7,8,9,10,sum; double average; sum=fun(a,N, ,int fun(int x,int m,double *avg) int i,sum=0; for(i=0;im;i+) sum=sum+xi; *avg=(double)sum/m; return sum; ,本章主要内容,一维数组与指针,一、一维数组的地址 数组名是表示数组首地址, 即第一个数组元素的地址,a即为&a0 数组元素ai的地址是&ai, &a0, &a1 数组元素ai的地址可表示为a+i, 即:a+i就是&ai 数组元素ai可用*(a+i)表示,#include int main( ) int i, a5=5,3,1,2,4; for(i=0; i5; i+) printf(“%d n”,*(a+i); ,二、指向数组元素的指针变量,如定义: int a10, *p = a; 则: p= 若令:p = &ai 则:*p就是ai 可见,当p=a时,有: &a0= a = p &ai = a+i = p+i=&pi ai = *(a+i)= *(p+i) =pi,指向数组的指针变量可以带下标,二、指向数组元素的指针变量,#include int main( ) int i, a5=5,3,1,2,4,*p; for(i=0; i5; i+) printf(“%d “,*(a+i); printf(“n“); /*地址法*/ for (p=a; pa+5; p+) printf(“%d “, *p); printf(“n“); /*指针法*/ ,注意:p是指针变量,取值可变,可指向各个数组元素 a是数组名,是地址(指针)常量,其值不可变,如定义: int a10, *p = a; 则: p= 若令:p = &ai 则:*p就是ai 可见,当p=a时,有: &a0= a = p &ai = a+i = p+i ai = *(a+i)= *(p+i),*a+,三、指向数组元素的指针的算术运算,如定义:int a10, *p = a, *q=a;,四、数组元素的引用方法,(1)下标法:如ai形式; (2)指针法:如*(a+i)或 *(p+i)。 如定义:int a5, *p = a;,通过改变p的值,也可使p指向任意数组元素,例:四种输出方法,#include int main() int a5=1,2,3,4,5,*p=a,i; for(i=0;i5;i+) printf(“%dt“,ai); printf(“n“); for(i=0;i5;i+) printf(“%dt“,*(a+i); printf(“n“); for(i=0;i5;i+) printf(“%dt“,*(p+i); printf(“n“); p=a; for(i=0;i5;i+,p+) printf(“%dt“, *p); return 0; ,更常用方法,常用,直观,例:int a =1,2,3,4,5,6,7,8,9,10,*p=a,i=5; 选择:数组元素地址的正确表示: (A) &(a+i) (B) a+ (C) &p (D) p+I 例:指出程序输出结果(略),int main() int a =5,8,7,6,2,7,3; int y,*p= ,6,y=5,5 6,例:指出程序中的错误,设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;,【例1】用指针实现将数组倒置,/*用下标变量实现*/ #include #define N 5 int main() int aN=5, 4, 3, 2, 1; int i=0 , j=N-1 , t ; while( 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+ ); ,本章主要内容,【例1】设10个整数的数组,求最大数的位置,#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; ,【例2】输入10个数,用选择法由小到大排序并输出,#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; ,下标法 交换法,【例2】输入10个数,用选择法由小到大排序并输出,#include #define N 10 int main() int aN, *p1, *p2, *pMin, t;

温馨提示

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

评论

0/150

提交评论