首页 第十章 指针

第十章 指针

举报
开通vip

第十章 指针null第十章 指针第十章 指针C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值 null10.1 指针的概念 变量与地址程序中: int i; float k; 内存中每个字节有一个编号-----地址ik 编译或函数调用时为其分配内存单元变量是对程序中数据 存储空间的抽象null指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址...

第十章 指针
null第十章 指针第十章 指针C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示复杂的数据结构 动态分配内存 得到多于一个的 关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函 数返回值 null10.1 指针的概念 变量与地址程序中: int i; float k; 内存中每个字节有一个编号-----地址ik 编译或函数调用时为其分配内存单元变量是对程序中数据 存储空间的抽象null指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量叫~2000指针指针变量 变量的内容 变量的地址null&与*运算符 含义含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左含义: 取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左两者关系:互为逆运算 理解i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址i_pointer &i &(*i_pointer) i *i_pointer *(&i)i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)null直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量例 i=3; -----直接访问3例 *i_pointer=20; -----间接访问20null例 k=i; --直接访问 k=*i_pointer; --间接访问10例 k=i; k=*i_pointer; null10.2 指针变量 指针变量与其所指向的变量之间的关系指针变量的定义 一般形式: [存储类型] 数据类型 *指针名;合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量 不是‘*’运算符例 int *p1,*p2; float *q ; static char *name;注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值null指针变量的初始化 一般形式:[存储类型] 数据类型 *指针名=初始地址值;赋给指针变量, 不是赋给目标变量例 int i; int *p=&i;变量必须与已说明过的 类型应一致例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值例 main( ) { int i; static int *p=&i; .............. } ()不能用auto变量的地址 去初始化static型指针null例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); }危险!例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }指针变量必须先赋值,再使用null零指针与空类型指针 零指针:(空指针) 定义:指针变量值为零 表示: int * p=0; p指向地址为0的单元, 系统保证该单元不作它用 表示指针变量值没有意义#define NULL 0 int *p=NULL:p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较 例 int *p; ...... while(p!=NULL) { ...… }void *类型指针 表示: void *p; 使用时要进行强制类型转换例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;表示不指定p是指向哪一种 类型数据的指针变量null例 指针的概念main() { int a; int *pa=&a; a=10; printf("a:%d\n",a); printf("*pa:%d\n",*pa); printf("&a:%x(hex)\n",&a); printf("pa:%x(hex)\n",pa); printf("&pa:%x(hex)\n",&pa); }运行结果: a:10 *pa:10 &a:f86(hex) pa:f86(hex) &pa:f88(hex)null例 输入两个数,并使其从大到小输出main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; if(ap2 表示p1指的元素在后 p1==p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义 p==NULL或p!=NULLnull数组元素表示方法[] 变址运算符 a[i]  *(a+i)a[i]  p[i]  *(p+i) *(a+i)null例 数组元素的引用方法main() { int a[5],*pa,i; for(i=0;i<5;i++) a[i]=i+1; pa=a; for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i)); for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i)); for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]); for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]); }null例 int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,i; 数组元素地址的正确表示: (A)&(a+1) (B)a++ (C)&p (D)&p[i]数组名是地址常量 p++,p-- () a++,a-- () a+1, *(a+2) ()null例 void main() { int a []={5,8,7,6,2,7,3}; int y,*p=&a[1]; y=(*--p)++; printf(“%d ”,y); printf(“%d”,a[0]); } 输出:5 6例 注意指针变量的运算6nullmain() { int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("%d",p++); printf("\n"); for(i=0;i<7;i++,p++) printf("%d",*p); }例 注意指针的当前值p=a;指针变量可以指到数组后的内存单元null数组名作函数参数 数组名作函数参数,是地址传递 数组名作函数参数,实参与形参的对应关系null例 将数组a中的n个整数按相反顺序存放 实参与形参均用数组void inv(int x[], int n) { int t,i,j,m=(n-1)/2; for(i=0;i<=m;i++) { j=n-1-i; t=x[i]; x[i]=x[j]; x[j]=t; } } main() { int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n"); }m=4null例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n) { int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; } } main() { int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n"); }实参用数组,形参用指针变量null例 将数组a中的n个整数按相反顺序存放 void inv(int *x, int n) { int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; } } main() { int i,a[10],*p=a; for(i=0;i<10;i++,p++) scanf("%d",p); p=a; inv(p,10); printf("The array has been reverted:\n"); for(p=a;py) z=x; else z=y; return(z); }main() { int max(int ,int), (*p)(); int a,b,c; p=max; scanf("%d,%d",&a,&b); c=(*p)(a,b); printf("a=%d,b=%d,max=%d\n",a,b,c); } int max(int x,int y) { int z; if(x>y) z=x; else z=y; return(z); }null用函数指针变量作函数参数例 用函数指针变量作参数,求最大值、最小值和两数之和null10.6 返回指针值的函数 函数定义形式: 类型标识符 *函数名(参数表); 例 int *f(int x, int y)例 指针函数实现:有若干学生成绩,要求输入学生序号后, 能输出其全部成绩main() { float score[][4]={{60,70,80,90}, {56,89,67,88},{34,78,90,66}}; float *search(float (*pointer)[4],int n), *p; int i,m; printf("Enter the number of student:"); scanf("%d",&m); printf("The scores of No.%d are:\n",m); p=search(score,m); for(i=0;i<4;i++) printf("%5.2f\t",*(p+i)); } float *search(float (*pointer)[4], int n) { float *pt; pt=*(pointer+n); return(pt); }null例 写一个函数,求两个int型变量中居于较大值的变量的地址2320022000**null例 写一个函数,求两个int型变量中居于较大值的变量的地址2002null例 写一个函数,求两个int型变量中居于较大值的变量的地址2332**null例 写一个函数,求两个int型变量中居于较大值的变量的地址不能返回形参或局部变量 的地址作函数返回值200Anull
本文档为【第十章 指针】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_871871
暂无简介~
格式:ppt
大小:1MB
软件:PowerPoint
页数:0
分类:其他高等教育
上传时间:2011-05-26
浏览量:14