得程序设设 20023
C语言程序设计 2002 年 第 七 章 指 针
71指针的概念与指针的使用 指针的概念 数据(变量、常量)(根据类型)占有一定数目的连续存 储单元; >数据的连续存储单元首地址称为数据的地址 程序中能操作变量、常量的地址; char c &c为变量c的地址。 const int NUM=10;&NUM为常量NUM的地址。 >变量的地址称为指针,存放地址数据的变量称为指针变量 pc &c 执行赋值操作pc=&c后,称pc指向c,或pc是c的指针; 变量c称为pc的指向
7.1 指针的概念与指针的使用 一、 指针的概念 ➢数据(变量、常量)(根据类型)占有一定数目的连续存 储单元; ➢数据的连续存储单元首地址称为数据的地址。 ➢程序中能操作变量、常量的地址; char c; &c为变量c的地址。 const int NUM=10; &NUM为常量NUM的地址。 ➢变量的地址称为指针,存放地址数据的变量称为指针变量。 &c ‘a’ pc c 执行赋值操作pc=&c后,称pc指向c, 或pc是c的指针; 变量c称为pc的指向
指针说明 存储类型区分符类型区分符标识符, 其中:*标识符称为指针说明符。 例: char c,*pc: float f, pf; int i, "pi; pc=&c; pf=&f; pi&i; pc pf pl &c &f &i
二、 指针说明 存储类型区分符 类型区分符 *标识符,……; 其中: *标识符 称为指针说明符。 例:char c,*pc; float f,*pf; int i,*pi; pc=&c; pf=&f; pi=&i; &c pc c &f pf f &i pi i
常见的复杂说明: int *pi: /整型数的指针变量,被指向的是一个整型数* int(pa)5; /指针变量,被指向的是一个长度为5的整型数组 int *a101 /*长度为10的指针数组,每一个元素都是整型指针* int *fpi(void);/函数印i的说明,fpi的返回值为整型指针* int(apfn(char*);/函数指针说明,p在不同时刻可指向不同的 函数入口,被指向的函数形参为字符指针,返回值为整型* int“(*pfpi(int);/函数指针说明,p在不同时刻可指向不同的 函数入口,被指向的函数形参为整型,返回值为整型指针
常见的复杂说明: int *pi; /*整型数的指针变量,被指向的是一个整型数*/ int (*pa)[5]; /*指针变量,被指向的是一个长度为5的整型数组*/ int *a[10]; /*长度为10的指针数组,每一个元素都是整型指针*/ int *fpi(void); /*函数fpi的说明,fpi的返回值为整型指针*/ int (*pfi)(char *); /*函数指针说明,pfi在不同时刻可指向不同的 函数入口,被指向的函数形参为字符指针,返回值为整型*/ int *(*pfpi)(int); /*函数指针说明,pfi在不同时刻可指向不同的 函数入口,被指向的函数形参为整型,返回值为整型指针*/
指针的使用 指针运算符 单目&取地址运算符 &与操作数组成的表达式称为地址表达式。该类表达式的运 算结果为操作数变量的地址。形式为: &操作数(注:数组名也是地址表达式) 操作数必须为左值表达式(变量和有名称的存储区) 例:inti,a[10 const int NUM=10: 地址表达式:&i &alo &NUM
三、指针的使用 1。指针运算符 单目& 取地址运算符 &与操作数组成的表达式称为地址表达式。该类表达式的运 算结果为操作数变量的地址。形式为: &操作数 (注:数组名也是地址表达式) 操作数必须为左值表达式(变量和有名称的存储区) 例: int i, a[10]; const int NUM=10; 地址表达式: &i &a[0] &NUM a
单目*间接访问运算符 通过指针间接访问指针所指向的对象。 例:inta=10; 直接写* p int“p=&a; /建立指向关系 &a printf(“%od”,a);/直接接读* printf(9d”,*p);/间接读* a 20 /间接写 &a 20 printf(%od”,a); printf(%d”,p); 单目*和&的互为逆运算: (&a)的值为a的值
单目* 间接访问运算符 通过指针间接访问指针所指向的对象。 例:int a=10; /*直接写*/ int *p=&a; /*建立指向关系*/ printf(“%d”,a); /*直接接读*/ printf(“%d”,*p); /*间接读*/ *p=20; /*间接写*/ printf(“%d”,a); printf(“%d”,*p); 单目*和&的互为逆运算: *(&a) 的值为a的值。 &a p a 1 0 &a p a 2 0
2。指针的正确用法 使用指针的目的:是给变量提供间接的操作,完成直接通 过变量名不能完成的操作,实现跨变量的作用域对变量实 施存取访问。 定义、使用方法步骤: (1)根据指针所指向数据的数据类型,定义指针变量; inta=10,b=20: int *pa, pb (2)建立指针和被指向数据的关系; pa=&a; pb=&b; (3)使用指针对被指向数据进行操作。 printf(%od %od", pa, pb;); 注 由于pa和pb是变量,不同时刻可指向不同数据; 例如:pa=&a;pb=&b;所以使用时,必须清楚 指针当前的指向
2。指针的正确用法 使用指针的目的:是给变量提供间接的操作,完成直接通 过变量名不能完成的操作,实现跨变量的作用域对变量实 施存取访问。 定义、使用方法步骤: (1)根据指针所指向数据的数据类型,定义指针变量; int a=10,b=20; int *pa,*pb; (2)建立指针和被指向数据的关系; pa=&a; pb=&b; (3)使用指针对被指向数据进行操作。 printf(“%d %d”,*pa,*pb;); 注: 由于pa和pb是变量,不同时刻可指向不同数据; 例如: pa=&a; pb=&b; 所以使用时,必须清楚 指针当前的指向
3。void指针和NULL指针 void指针是类型为void*的指针;(空类型指针) void*的指针是一种通用指针类型。表示该指针指向不定类 型 任何指针变量都可赋予整数0(一个特殊的指针,空指针) C语言用符号常量NULL表示空指针, NULL在stdo.h和 stdllib, h中定义: #define null o 通常,用NULL与非NULL判断某种操作的结果: void*p;p= malloc(10);判断p char sI=“abc”;s2l=“123”,*pc; pc=strstr(sl, s2) 判断pc
3。void指针和NULL指针 void指针是类型为void *的指针;(空类型指针) void *的指针是一种通用指针类型。表示该指针指向不定类 型。 任何指针变量都可赋予整数0(一个特殊的指针,空指针) C语言用符号常量NULL表示空指针, NULL在stdio.h和stdlib.h中定义: #define NULL 0 通常,用NULL与非NULL判断某种操作的结果: void *p; p=malloc(10); 判断p char s1[]=“abc”; s2[]=“123”,*pc; pc=strstr(s1,s2); 判断pc
72指针的运算 算术运算 (1)指针加、减一个整数 int a[10,*p=&a4; a0]a[]a2]a[3]a[4]a[5]a[6]a7a[8]a[9 a1000 p1008 p+3表达式的值为a7的地址;1008+3* sizeof(int)=1014 p-4表达式的值为a0的地址。1008-4* sizeof(int)=1000
7.2 指针的运算 1. 算术运算 (1)指针加、减一个整数 int a[10], *p=&a[4]; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 1000 p+3 表达式的值为a[7]的地址;1008+3*sizeof(int)=1014 p-4 表达式的值为a[0]的地址。1008-4*sizeof(int)=1000 p 1008
(2)两个指针相减 inta[10l,“pl=&a2],“p2=&a[7]; intb|6],*p3=&b|4l; float c5,*p4-=&b|3}; ao]a[]a[2]a3]a[4]a[5]a[6]a[7a8]a[9 a1000 p 11004 21014 p2-p1表达式的值整型数;表示p1与p2之间间隔元素的数目。 (1014-1004) /sizefo(int)=10/2=5 p3-p1无意义; p4-p2无意义
(2)两个指针相减 int a[10], *p1=&a[2], *p2=&a[7]; int b[6], *p3=&b[4]; float c[5], *p4=&b[3]; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 1000 p2-p1 表达式的值整型数;表示p1与p2之间间隔元素的数目。 (1014-1004)/sizefo(int)=10/2=5 p3-p1 无意义; p4-p2 无意义. p1 1004 p2 1014