c语言指针

上传人:luoxia****01816 文档编号:54502815 上传时间:2018-09-14 格式:PPT 页数:86 大小:439KB
返回 下载 相关 举报
c语言指针_第1页
第1页 / 共86页
c语言指针_第2页
第2页 / 共86页
c语言指针_第3页
第3页 / 共86页
c语言指针_第4页
第4页 / 共86页
c语言指针_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《c语言指针》由会员分享,可在线阅读,更多相关《c语言指针(86页珍藏版)》请在金锄头文库上搜索。

1、计算机程序设计基础,刘宝林清华大学计算机系,2,指针数据类型 指针与函数 指针与复合数据类型 指针数组和指向指针的指针 指针小结,第8讲 指针,3,指针 概念及定义,在说明指针及指针变量之前,先举一个简单例子在座的每个同学,都有一个名字,都住在各自的宿舍里,那么,房号,就是该同学的地址,地址内的内容就是该同学。对于计算机而言,内存是存放数据的,它也是以地址来识别的,内存中每一个字节有一个编号,就是“地址”。字节内存放的数据,这就是 “内容”。地址,也称为指针,存放地址值的变量,称为指针变量,4,直接访问方式 按变量的地址存取变量值的方式 printf(“%d”,i); scanf(“%d”,

2、间接访问方式通过一个变量找到另一个变量的地址,然后对其存取,5,数据对象的地址与值 地址:数据对象的存储位置在计算机中的编号 值:在该位置处存储的内容 地址与值是辩证统一的关系数据对象的左值与右值 左值:出现在赋值号左边,对应数据对象的地址 右值:出现在赋值号右边,对应数据对象的值 部分数据对象既有左值也有右值,如普通变量、数组元素、结构体类型变量等 部分数据对象只有右值没有左值,如单独出现的数组名称、文字常数、常量、普通数学表达式与函数调用,6,概念 指针:一个变量的地址,称为该变量的指针 指针变量:用于存放指针(地址)的变量 如果有一个变量A存放了另一个变量B的地址,就称A“指向” 变量B

3、,A称为指向变量B的指针变量。 定义 一般形式: 类型标示符 *标示符例: int *i_ pointer;指向整型变量的指针用“*”代表“指向”,变量的指针和指向变量的指针变量,7,i=3; *i_ pointer=3; pointer_5是指向实型变量的指针变量 char *pointer_4; =pointer_4是指向字符型变量的指针变量 也可用赋值语句使一个指针变量指向一个整形变量如: pointer_1= 注意事项 1. 标识符前面的“*”表示该变量为指针变量。 2. 一个指针变量只能指向同一类型的变量。 3. 用变量地址作为初值时,该变量必须在指针变量初始化之 前已说明过,且变量

4、类型应与指针变量类型一致。 4. 可以用一个已赋初值的指针变量去初始化另一个指针变量。,8,引用注意:指针变量中只能存放地址(指针),不能将一个整数赋给一个指针变量例: i_pointer= 不合法 两个关系运算符:&:取地址运算,&a为变量a的地址*:指针运算符,*p:指针变量p所指向的变量*也称为“间接访问”运算符,9,指针变量的存储布局,指针数据对象(变量)与目标数据对象(变量) 仅定义指针变量,未初始化 例一:int * p;定义指针变量,并使其指向某个目标变量 例二:int n = 10; int * p = ,p,0,x,00130000,n,10,0,x,00130000,10,

5、定义指针变量,并使其指向数组首元素 例三:int a8 = 1, 2, 3, 4, 5, 6, 7, 8; int * q = a;,q,0,x,00130000,a,1,0,x,00130000,.,2,11,指针变量的赋值,指针变量可以像普通变量一样赋值 示例:int n = 10; int * p = 两个指针指向同一个目标数据对象,p,0,x,00130000,n,10,0,x,00130000,q,0,x,00130000,12,取址操作符,取址操作符“,p,0,x,00130000,n,10,0,x,00130000,q,0,x,00130000,13,引领操作符,引领操作符 获取

6、指针所指向的目标数据对象 例一:int m, n = 10; int * p = 使得 n 为 1,p,0,x,00130000,n,10,0,x,00130000,m,10,0,x,00130010,14,例1 /*指针的概念*/#include“stdio.h”void main( )int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1=,15,注意事项:(1) &与*运算符的优先级相同,但按自右而左方向结合&*pointer_1 =先执行*pointer_1,若*pointer_1=a,则&*pointer_1=&a(2) *&a=

7、*(&a)=*pointer_1=a(3) (*pointer_1)+ =a+,括号不能少,否则变成=*(pointer_1+),16,例2 输入a和b两个数,并由大到小输出 /*本例中不交换整形变量的值,而是交换指针变量的值*/#include “stdio.h”void main ( )int a,b,*p1,*p2,*p;scanf(“%d,%d“,Resulta=5, b=9 *p1=9,*p2=5,17,指针的意义与作用,作为函数通信的一种手段 使用指针作为函数参数,不仅可以提高参数传递效率,还可以将该参数作为函数输出集的一员,带回结果 作为构造复杂数据结构的手段 使用指针构造数据对

8、象之间的关联,形成复杂数据结构 作为动态内存分配和管理的手段 在程序执行期间动态构造数据对象之间的关联 作为执行特定程序代码的手段 使用指针指向特定代码段,执行未来才能实现的函数,18,指针与函数,指针变量作为函数的参数 函数的指针和指向函数的指针变量 返回指针的函数,19,指针变量作为函数的参数 它的作用是将一个变量的地址传送到另一个函数中。 例3 /*本例中不交换指针变量的值,而是交换整形变量的值*/#include “stdio.h” void swap(int *p1,int *p2) void main ( ) int p; int a,b,*p1,*p2; p=*p1; *p1=*

9、p2; *p2=p;scanf(“%d,%d“, ,Result a=9, b=5 *p1=9,*p2=5,指针变量作为函数的参数,20,要想通过调用一个函数,改变某些变量的值,在主调函数(如:main函数)中使用这些改变了的值。采用的方法是:通过指针变量改变变量的值。如果想通过函数的调用,来得到n个要改变的值,可以采取以下几个步骤:1. 在主调函数中设n个变量,用n个指针变量指向它们;2. 然后将指针变量作为实参,将这n个变量的地址传给所调用 的函数的形参;3. 通过形参指针变量,改变n个变量的值;4. 主调函数中就可以使用这些改变了值的变量。,21,例4 /*本例中只改变变量值,指针变量值

10、并没有改变*/#include “stdio.h”void main ( ) int a,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d”,void swap(int *p1,int *p2) int p;p=*p1; *p1=*p2; *p2=p; ,void exchange(int *q1,int *q2,int *q3) if(*q1*q2) swap(q1,q2);if(*q1*q3) swap(q1,q3);if(*q2*q3) swap(q2,q3);,Resulta=9,b=5,c=0 *p1=9,*p2=5,*p3=0,22,函数的指针和指向函数的指针变量,指

11、针变量可以指向变量、字符串和数组,也可以将指针 指向函数。 函数指针的定义:函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。 指向函数的指针变量的一般形式为:数据类型标识符(*指针变量名)( );即函数返回值的类型例 int (*p)( ); (1) p先与*结合,说明p是指针变量。(2) 然后再与( )结合,说明该指针变量指向函数,这个函数的返回值是整型。,23,注意,(*p)( )表示定义一个指向函数的指针变量,而不固定指向哪一个具体的函数。 (2) 在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。 (3) 在一个程序中,一个指针变量可以先后指向不同的函数。 (4) 在

12、给函数指针变量赋值时,只需给出函数名,而不必给出参数。 (5) 对指向函数的指针变量,p+,p-,p+n等是无意义。,24,例10 调用process函数每次实现不同的功能。指针变量指向不同的函数 #include“stdio.h” void main( ) int max(int,int),min(int,int),add(int,int); int a,b;printf(“Please enter a and b:“);scanf(“%d,%d“, ,fun即为指向函数的指针变量,分别指向max, min, add,process(int x,int y, int (* fun)( ) i

13、nt result;result=(*fun)(x,y);printf(“%dn“,result);,int min(int x,int y) int z;if (xf1(x)=1+x2f2(x)=1+x+x2+x3f3(x)=x/(1+x2) S=hf(a)+f(b)/2+f(a+h)+f(a+2h)+f(a+(n-1)h),26,/*利用指向函数的指针变量的特性,求解定积分*/float integral (float (*fun)( ), float a,float b) float s,h,y;int n,i;s=(*fun)(a)+(*fun)(b)/2.0;n=100;h=(b-a

14、)/n;for (i=1;in;i+)s=s+(*fun)(a+i*h);y=s*h;return(y); #include “stdio.h” void main( ) float y1,y2,y3;y1=integral(f1,0.0,1.0);y2=integral(f2,0.0,2.0);y3=integral(f3,0.0,3.5);printf(“y1=%6.2fny2=%6.2fny3=%6.2fn“,y1,y2,y3); ,float f1(float x) float f; f=1+x*x;return (f); ,float f2(float x) float f;f=1+

15、x+x*x+x*x*x;return (f); ,float f3(float x) float f;f=x/(1+x*x);return (f); ,27,指针与函数返回值,指针类型可以作为函数返回值 函数内部返回某个数据对象的地址 调用函数后将返回值赋值给某个指针 特别说明:不能返回函数内部定义的局部变量地址 程序示例 int global = 0; int * ReturnPointer() return ,28,一般形式:类型标识符 *函数名(参数表)如:int *a(int x,int y) 这是一个指针型函数,函数的返回值是指针,因此称作返回指针 值的函数。与指向函数的指针定义方式不同,注意比较。,29,例12 有若干个学生,每个学生有4门课,要求在输入学生学号以后,输出该学生的全部成绩,用返回指针值的函数来实现#include “stdio.h”void main( )static float score 4=86,90,80,92,96,88,96,86,84,94,85,74;float *search( ); /* 返回指针值的函数,其结果就是指针 */float *p; int i,m; /* m是要查找的学生的学号*/printf(“Enter the number of the student:“);scanf(“%d“,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 物流与供应链

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