第10章指针
1 第10章 指针
指针是C中的重要概念和内容,也是C的特色, 但对初学者来说不易掌握。 在C程序设计中指针用得很多,一方面是由于 有时候它是表达一种处理的唯一手段;另一方面使 用它要比使用其他手段更高效。特别对于系统软件 设计而言,该语言功能是必要的。 可以这样说,不能正确、熟练、灵活地使用这 种语言功能就没有很好掌握C 本章详细讨论C语言中指针的概念和使用
2 指针是C中的重要概念和内容,也是C的特色, 但对初学者来说不易掌握。 在C程序设计中指针用得很多,一方面是由于 有时候它是表达一种处理的唯一手段;另一方面使 用它要比使用其他手段更高效。特别对于系统软件 设计而言,该语言功能是必要的。 可以这样说,不能正确、熟练、灵活地使用这 种语言功能就没有很好掌握C! 本章详细讨论C语言中指针的概念和使用
101地址和指针的概念一般以字 1)地址的概念 节为单位 地址是内存单元的唯一编号。地址是何种形式与 所用系统有关。例如: main( int i char cg float f printf(“%p,%p,%p3”,&i,&C,&f) 程序在TC20上运行后的输出为: FFD6. FFD9 FFDA
3 10.1 地址和指针的概念 1) 地址的概念 地址是内存单元的唯一编号。地址是何种形式与 所用系统有关。 程序在TC2.0上运行后的输出为: FFD6 , FFD9 , FFDA main ( ) { int i ; char c ; float f ; printf ( “%p ,%p , %p” , &i, &c, &f ) ; } 一般以字 节为单位 例如:
内存(DS段) 在TC系统中的每个地址: DS:0000 用两个字节存储 用四位十六进制表示 DS: FFD6 是相对于DS段数据段的 DS: FFD 相对地址 DS: FFDs DS: FFD9 表示形式是: DS: FFDA i的地址DS:FFD6H DS: FFDB c的地址DS:FF9H DS: FFDC DS: FFDE f的地址DS: FFDAH 4
4 i 的地址 DS:FFD6H c的地址 DS:FFD9H f的地址 DS:FFDAH … DS: 0000 i DS: FFD6 DS: FFD7 DS: FFD8 DS: FFD9 DS: FFDA DS: FFDB DS: FFDC DS: FFDE 内存(DS段) … c f 在TC系统中的每个地址: 用两个字节存储 用四位十六进制表示 是相对于DS段(数据段)的 相对地址 表示形式是:
记住: 在C中地址是一种特别的数据类型(指针类型) 不同于整型量,二者不相容。 ■&是单目运算符;优先级仅低于小括号;结合方 向自右向左; ■&的操作数只能是变量名和数组元素名不能是 常量、表达式和 register型变量名
5 记住: 在C中地址是一种特别的数据类型 (指针类型) , 不同于整型量,二者不相容。 & 是单目运算符; 优先级仅低于小括号;结合方 向自右向左; &的操作数只能是变量名和数组元素名,不能是 常量、表达式和register型变量名
2)指针概念 指针即是内存单元的地址,只不过它是C语言中对 地址的称呼。 在C语言中指针是一种数据类型声明这种类型的 变量将给该变量分配该两个字节的存储空间,用于 存放一个地址量。因此指针类型对象的值是一个内 存地址 一个变量的地址称为该变量的指针即该变量占用 的内存区城的起始地址
6 2) 指针概念 指针即是内存单元的地址, 只不过它是C语言中对 地址的称呼。 在C语言中,指针是一种数据类型,声明这种类型的 变量,将给该变量分配该两个字节的存储空间, 用于 存放一个地址量。 因此指针类型对象的值是一个内 存地址。 一个变量的地址称为该变量的指针,即该变量占用 的内存区域的起始地址
个数组的指针指的是数组存储空间的起始地址, 也即第一个数组元素的地址,数组名代表这个地址 因此,数组名是一个指针型量且是指针常量。例如: main int c10 float s5 i long do; printf(“%p,%p,%p”,C,s,d); 程序运行后的输出可能是: FF8C. FFAO. FFB4
7 一个数组的指针指的是数组存储空间的起始地址, 也即第一个数组元素的地址, 数组名代表这个地址。 因此,数组名是一个指针型量且是指针常量。例如: 程序运行后的输出可能是: FF8C, FFA0, FFB4 main ( ) { int c[10] ; float s[5] ; long d[10] ; printf ( “%p, %p, %p”, c , s , d ) ; }
函数是一段程序程序要在内存中才能执行。因此 函数也有内存地址。函数在內存的存储地址称为函 数指针。函数名代表函数的地址,是一个指针型常 量。例如: void f( void) printf(“helo0”); main f();/调用数* printf(“%p”,f) 该程序运行后输出的函数地址可能是: 020F/这就是f函数的指针* 8
8 函数是一段程序,程序要在内存中才能执行。因此 函数也有内存地址。 函数在内存的存储地址称为函 数指针。函数名代表函数的地址, 是一个指针型常 量。例如: 该程序运行后输出的函数地址可能是: 020F /*这就是f函数的指针*/ void f ( void ) { printf ( “hello” ) ; } main ( ) { f ( ) ; /*调用f函数*/ printf ( “%p”, f ) ; }
10.2指针变量 这是指针变这是指针变量所 针变量。当 的存储类型。指向对象的数据类型。,就称该指 auto、 register为方便叙述,不妨将 于局部量)、§其称为“基类型” 其 extern因此可以放置任何数据类定 变量也具有局型关键字 类型的 局临时和永久特k口心址量,-般形式 为 存储类型数据类型)指针变量名
9 10.2 指针变量 用于存储变量地址的变量称之为指针变量。当 一个指针变量存储了某个变量的地址后, 就称该指 针变量指向那个变量. 1、指针变量的声明(定义) 指针是一种特殊数据类型,与其他数据类型的 变量一样必须先定义后使用。 指针定义的一般形式 为: 存储类型 数据类型 * 指针变量名 该“*”指出其 后的标识符被定 义成指针类型, 用于存放地址量。 这是指针变量本身 的存储类型。可指定 auto、register(仅用 于局部量)、static、 extern。 因此 , 指针 变量也具有局部与全 局、临时和永久特性。 这是指针变量所 指向对象的数据类型。 为方便叙述, 不妨将 其称为“基类型” 。 可以放置任何数据类 型关键字
旦定义了指针变量,便可用它来存放(指向) 与其基类型相同的某个对象的地址。如下面的指针 变量定义: ntp g xp总是用于存放int型对象的地址。换句话说, xp中存储的地址所指向的存储区域中的内容总按int 型数据来解释。 若in型数据为16位,并假定分配给一个int型变 量k的存储区域的首地址为2000,如果执行: xp=&k; 则有:
10 一旦定义了指针变量, 便可用它来存放( 指向 ) 与其基类型相同的某个对象的地址。 如下面的指针 变量定义: int *xp ; xp 总是用于存放 int 型对象的地址。换句话说, xp中存储的地址所指向的存储区域中的内容总按 int 型数据来解释。 若int型数据为16位 , 并假定分配给一个int 型变 量k的存储区域的首地址为2000 ,如果执行: xp = &k ; 则有: