()第十章指针 Ch10指针 内容提要: ★指针的概念 ★指针变量 ★指针与数组 ★指针与字符串 ★指针与函数 ★返回指针值的函数 ★指针数组和多级指针
1 第十章 指针 Ch10 指针 内容提要: ★指针的概念 ★指针变量 ★指针与数组 ★指针与字符串 ★指针与函数 ★返回指针值的函数 ★指针数组和多级指针
()第十章指针 10.1指针的概念 变量与地址 内存中每个字节有一个编号—-地址 内存 程序中:inti 2000 2001 float ks 02 2003 编译或函数调用时为其分配内存单元 k 005 变量是对程序中数据 存储血间的抽泉
2 第十章 指针 ▪ 10.1 指针的概念 • 变量与地址 程序中: int i; float k; 内存中每个字节有一个编号-----地址 …... …... 2000 2001 2002 2005 内存 0 2003 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据 存储空间的抽象
()第十章指针 指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量叫 指针 区2000 整型变量i 2001 10 变量的地址 变量的内容 2002 2003 2004 变量 i pointer onn 指针变量变量地址(指针) 指向 地址存入 变量变量值 指针变量
3 第十章 指针 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 • 指针与指针变量 ▪ 指针:一个变量的地址 ▪ 指针变量:专门存放变量地址的变量叫~ 2000 指针 指针变量 变量的地址 变量的内容 指针变量 变量 变量地址(指针) 变量值 指向 地址存入 指针变量
第中章指针= 与*运算符 含义:取变程者关敷指钙趟算的内容 单目运算霉解目运算符 I pointer I pointer 优先级:2 & upon中2000 结合性自 2000 整型变量i 2001 10 2002 i pointer =&i =&(i pointer) 2003 i=*i_pointer =*(&i) 2004 变量 i pointer 2005 2000 指针变量 2006 pointer- 指针变量,它的内容是地址量 i pointer---指针的目标变量,它的内容是数据 & ci pointer-指针变量占用内存的地址
4 第十章 指针 • &与*运算符 ▪ 含义 含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左 含义:取指针所指向变量的内容 单目运算符 优先级: 2 结合性:自右向左 ▪ 两者关系:互为逆运算 ▪ 理解 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 指针变量 i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 2000 10 i_pointer *i_pointer &i_pointer i i_pointer &i &(*i_pointer) i *i_pointer *(&i) i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)
第十章指针 直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量 例i3; 直接访问 (2000 整型变量i 2001 20 2002 2003 2004 ←变量 i pointer 2005 -2000 指针变量 2006 例 i pointer=20; 间接访问
5 第十章 指针 • 直接访问与间接访问 ▪ 直接访问:按变量地址存取变量值 ▪ 间接访问:通过存放变量地址的变量去访问变量 例 i=3; ----直接访问 指针变量 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 3 例 *i_pointer=20; ---间接访问 20
第中章指针= 例k=i; 直接访问 pointer; 间接访问 Q2000 整型变量i 2001 10 2002 整型变量k 2003 2004 一变量 i pointer 2005 2000 指针变量 2006
6 第十章 指针 指针变量 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 整型变量k 例 k=i; --直接访问 k=*i_pointer; --间接访问 10 例 k=i; k=*i_pointer;
第中章指针= 10.2指针变量 指针变量与其所指向的变量之间的关系 i pointer 变量i *i pointer 2000 i pointer I pointer ki_pointer=3 指针变量的定义 一般形式:[存储类型]数据类型指针名; 例 int*pl,p2 角ea*示定义指针变量 注指针变量萍符卡型标识诗 1、int*pl,*p2;与int*pl,p2 2、指针变量名是p1p2,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
7 第十章 指针 ▪ 10.2 指针变量 指针变量与其所指向的变量之间的关系 • 指针变量的定义 ▪ 一般形式: [存储类型] 数据类型 *指针名; 3 变量i 2000 i_pointer *i_pointer i *i_pointer &i i_pointer i=3; *i_pointer=3 3 变量i 2000 i_pointer *i_pointer i *i_pointer &i i_pointer i=3; *i_pointer=3 指针变量本身的存储类型 指针的目标变量的数据类型合法标识符 表示定义指针变量 不是‘*’运算符 例 int *p1,*p2; float *q ; static char *name; 注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
第十章指针 指针变量的初始化 般形式:[存储类型]数据类型*指针名=初始地址值; 例inti 赋给指针变量 int *p=& 变量必须已说明过 刂inti 类型应一致 例 int“&ip=&i; int i; int *9p; 用已初始化指针变量作初值 例main() i int 1; l0-1c static int *p=&i; 不能用auto变量的地址 去初始化 static型指针 8
8 第十章 指针 • 指针变量的初始化 一般形式:[存储类型] 数据类型 *指针名=初始地址值; 赋给指针变量, 不是赋给目标变量 例 int i; int *p=&i; 变量必须已说明过 类型应一致 例 int *p=&i; int i; 例 int i; int *p=&i; int *q=p; 用已初始化指针变量作初值 例 main( ) { int i; static int *p=&i; .............. } 不能用auto变量的地址 去初始化static型指针 ()
()第十章指针 指针变量必须先赋值,再使用 例main() i int 1=10; int *ps 2000 整型变量 p=1 printf(%d”,p); 2001 10 2002 2003 2004 指针变量p 2005 例main() 随枳 2006 int i=10, k; int x =&k printf(%d”,*p);
9 第十章 指针 例 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); } 指针变量必须先赋值,再使用 …... …... 2000 2004 2006 2005 整型变量i 10 指针变量p 2001 2002 2003 随机
()第十章指针 零指针与空类型指针 零指针:(空指针) p指向地址为0的单元, 定义指针变量值为零系统保证该单元不作它用 °表示:int*p=0; 表示指针变量值没有意义 #define null o int *p=NULL 例int*p; p=NUL与未对p赋值不同 HHlEDlNoll 用途: 例ar.p1;} 避免指针变量的非法引用 void“p2; 在程序中常作为状态比较 pl=(char *)p2; void*类型指针 表不排9⊥种 表示:void*p 类型数据的指针变量 使用时要进行强制类型转换
10 第十章 指针 • 零指针与空类型指针 ▪ 零指针:(空指针) • 定义:指针变量值为零 • 表示: 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是指向哪一种 类型数据的指针变量