计算机设计语言(c语言)t7.

上传人:我** 文档编号:117117834 上传时间:2019-11-18 格式:PPT 页数:65 大小:498.50KB
返回 下载 相关 举报
计算机设计语言(c语言)t7._第1页
第1页 / 共65页
计算机设计语言(c语言)t7._第2页
第2页 / 共65页
计算机设计语言(c语言)t7._第3页
第3页 / 共65页
计算机设计语言(c语言)t7._第4页
第4页 / 共65页
计算机设计语言(c语言)t7._第5页
第5页 / 共65页
点击查看更多>>
资源描述

《计算机设计语言(c语言)t7.》由会员分享,可在线阅读,更多相关《计算机设计语言(c语言)t7.(65页珍藏版)》请在金锄头文库上搜索。

1、第7章 指 针 指针是C 语言中的一个重 要概念,是C 语言的 精华。 1. 内存单元地址 程序中定义了变量后,在编译时系统就给这个变量分配内存单元。 内存中每一个内存单元都有一个编号,这就是“地址”。 内存单元地址 就是编译后系统分配给变量的内存空间位置。 例如: int i , j, k; 7.1 地址和指针的概念 内存用户数据区 变量k 变量j 变量i 2000 2002 2004 其中2000为 i 的地址 2002为 j 的地址 2004为 k 的地址 数据在内存中的存取方式:直接访问方式 和 间接访问方式。 直接访问方式:按变量地址存取变量值。 间接访问方式: 把一个变量的地址放在

2、另一个变量中。 内存单元的内容 内存单元中存放的数值。 例如:i=3 ;j=6 ; 在2000单元中存放数值 3,3 即为内容。 在2002单元中存放数值 6,6 即为内容。 变量 i 变量 j 6 3 2000 2002 例: printf(“%d“, i ) ; 其执行是这样的:根据变量名与地址的对应关系,找到变 量i 的地址2000,然后从由2000开始的两个字节中取出数据(即变 量的值3),把它输出。 这种按变量地址存取变量值的方式称为“直接访问”方式。 例如,我们定义一个变量 i_pointer ,用来存放整型变量i 的地址: i_pointer = /* 把变量 i 的地址赋给变量

3、 i_pointer */ 这时i_pointer的值 就是变量 i 所占用的内存单元的起始地址(2000)。 如何存取变量i 的值? 变量 i 变量 j 2000 6 3 2000 2002 变量i_pointer3010 间接访问方式: 通过存储在某一个内存单元中的地址去存取该地址所 指向的内存单元中的变量值。 要存取变量i 的值, 先要找到存放i 的地址的 变量(i_pointer),从中 取出i 的地址(2000), 然后到2000、2001字节 中取出i 的值(3)。 表示将数值3送到变量中,有两种方法: 将3 送到变量i 所标志的单元中。 将3 送到变量i_pointer 所“指向

4、”的单元中。 所谓“指向”就是通过地址来体现的。 (如右图所示) 由于通过地址可以找到所需的变量单元,因此可以说,地址“指向”该内 存单元。在C 语言中,将地址形象化地称为“指针”。 一个变量的地址称为该变量的“指针”。例如地址2000是变量i的指针。 如果有一个变量,专门用来存放另一个变量的地址(即指针),则它称 为“指针变量 ”。如前面所说的i_pointer变量称为指针变量。指针变量的值是 指针(地址)。 注意: (1) “指针” 和 “指针变量” 这两个不同的概念。 (2) 通过指针变量如何访问变量 i 的值? (间接访问) 2000 i 3 2000 i 3 2000 i_point

5、er 变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指 向另一个变量。 指针变量和它所指向的变量之间,用“ * ” 表示“ 指向”。 例如 i_pointer代表指针变量,* i_pointer 是i_pointer所指向的变量。 7.2 变量的指针和指向变量的指针变量 * i_pointer 2000 3 2000 i_pointer i 可以看到,* i_pointer也代表一个变 量,它和变量i 是同一回事。下面两 个语句作用相同: i=3; * i_pointer=3; 第个语句的含义是将3 赋给指针变 量i_pointer所指向的变量。 7.2.1 定义一个指针变量 指

6、针变量是专门用来存放地址的,因此必须定义为“ 指针类型”。 指针变量定义的一般形式: 基类型 * 指针变量名 指针变量的基类型 用来指定该指针变量可以指向的变量的类型。 例如: int *pointer_1,*pointer_2 ;(指向整型变量的指针变量) float *pointer_3;(指向实型变量的指针变量) char *pointer_4;(指向字符型变量的指针变量) 注意: 1. 指针变量前面的“ * ” 表示该变量是指针变量。 指针变量名是 pointer_1、pointer_2 ,而不是*pointer_1、*pointer_2 . 2. 在定义指针变量时必须指定基类型。 不

7、同类型的数据在内存中所占的字节数是不同的。 指针变量的类型说明 是为了告诉系统按变量中的地址从内存选取几个字节 的数据进行操作,便于 指针的移动和指针的运算操作。 3. 一个指针变量只能 指向同一类型的变量,即存放同一类型变量的地址。 怎样使一个指针变量指向另一个变量呢? 可以使用赋值语句。 例如: float x ; char ch ; float * pointer_3 ; char * pointer_4 ; pointer_3 = pointer_4 = 例: int k, i=5; int *pointer; pointer= k = *pointer ; printf(“%d“,

8、k); printf(“%d“ , *pointer) ; 2000 (地址) pointer 20005 (数据) *pointer i 2000 输出变量 i 的值5 k的值为5 7.2.2 指针变量的引用 指针变量中只能存放地址(指针),不能将一个整型量或任何其它 非地址类型的数据赋给一个指针变量。 例如赋值语句:pointer_1=2000; (不合法) 有关地址的运算符: 1. int *pointer_1 ,*pointer_2; /*定义指针变量,指向整型变量*/ a=100; b=10; pointer_1= /* 使pionter_1指向a */ pointer_2= /*

9、使pionter_2指向b */ printf(“%d,%dn“, a , b) ; printf(“%d,%dn“, *pointer_1 , *pointer_2) ; 例7.1 通过指针变量访问整型变量。 运行结果: 100,10 100,10 pointer_2= 则 表达式 如果有 pointer_2= 则结果如何? 先执行 则表达式 * scanf(“%d,%d“, p1= p2= if(atest hello worl d (2) #include main( ) int a=10 , b=80 ; int *p1= printf(“1. a=%d , b=%d , *p1=%d

10、 , *p2=%dn“ , a , b , *p1 , *p2) ; *p1=20 ; printf(“2. a=%d , b=%d , *p1=%d , *p2=%dn “, a , b , *p1 , *p2) ; *p2=30 ; printf(“3. a=%d , b=%d , *p1=%d , *p2=%dn“, a , b , *p1 , *p2) ; p1= printf(“4. a=%d , b=%d , *p1=%d , *p2=%dn “, a , b , *p1 , *p2) ; (3) int x =1 , 2 ; int y =4 , 5 , 6 ; int z =7

11、 , 8 , 9 ; int *a =x , y , z ; main( ) int *t ; printf(“%dt“ , *a0) ; t=a0+1 ; printf(“%dt“ , *t) ; t=a1 ; printf(“%dt“ , *t) ; printf(“%dt“ , *(t+1) ; printf(“%dn“ , *(a+2) ; (4) main( ) char *p ; int m ; p=“abcdef ghijk! “; m=len (p) ; printf(“length of = %dn“ , p , m) ; len (char *ptr) int j ; fo

12、r(j=0 ;* ptr+ != 0 ; j+) ; return( j ) ; (二)P258 10.6 10.7 10.13 10.15 10.18 10.20 例1. 查12个月英文单词。 main( ) int n ; char *month_name( ) ; scanf(“%d“ , printf(“%d month : %sn “, n , month_name( n) ; char *month_name(int x) char *name = “illagal month“ , “January“ , “February“ , “March “, “April “, “May

13、 “, “June “, “August“ , “September“ , “October “, “November“ , “December“ ; return( (x12)? name0 : namen) ; 10 . 3 int a10 ; void input( ) int j ; for(j=0 ; j0) temp=*(a+0) ; *(a+0)=*(a+m) ; *(a+m)=temp ; if(n90:%5.2fn “, i+1 , ave_stui) ; for(i=0 ; i=2) for(j=0 ; j80:%5.2ft “ , i+1 , scoreij) ; voi

14、d main( ) input( ) ; ave( ) ; search( ) ; 10.13 #include main( ) float process(float a , float b, int m , float (*pt)( ) ; float a , b , a1 , b1 , a2 , b2 , (*p)( ) , area ; int n ; printf(“ Input step number :n“) ; scanf(“ %d “, printf(“ Input (a,b),(a1,b1),(a2,b2) :n “) ; scanf(“ %f , %f , %f , %f

15、 , %f, %f “ , p=sin ; area=prosess(a , b , n , p) ; printf(“ sin(x)=%fn “, area) ; p=cos ; area=prosess(a1 , a2 , n , p) ; printf(“ cos(x)=%fn “ , area) ; p=exp ; area=prosess(a2 , b2 , n , p) ; printf(“ exp=%fn “ , area) ; float process(float a , float b , int m , float (*pt)( ) int j ; float h , x , sum=0.0 ; x=a ; h=(b-a)/(float)m ; for(j=1 ; jt return 正数 */ /* if st return 负数 */ /* if s=t return 0 */

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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