C语言程序设计 清华大学 郑莉 安颖莲
Page 1
第六讲 指针参考书,C程序设计,第九章
C语言程序设计 清华大学 郑莉 安颖莲
Page 2
本讲主要内容
指针变量
指向数组元素的指针
字符指针与字符串
指针数组
指向一维数组的指针
多级指针
以指针作为函数参数
指针型函数
指向函数的指针
C语言程序设计 清华大学 郑莉 安颖莲
Page 3
定义例,static int i;
static int *i_pointer=&i;
指向整型变量的指针指针变量 — 概念及定义
概念
- 指针:另一个变量的地址用于间接访问变量
- 指针变量:
用于存放地址的变量
2000 3
i_pointer *i_pointer
i
2000
内存用户数据区变量 i
变量 j
变量
i_pointer
3
6
2000
2000
2002
3010
引用例 1,i=3;
例 2,*i_pointer=3;
C语言程序设计 清华大学 郑莉 安颖莲
Page 4
指针变量
—— 初始化
语法形式存储类型 数据类型 *指针名=初始地址;
例,int *pa=&a;
注意事项
- 用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。
- 可以用一个已赋初值的指针去初始化另一个指针变量。
- 不能用一个内部 auto 型变量去初始化 static 型指针。
例 1
C语言程序设计 清华大学 郑莉 安颖莲
Page 7
指针变量
—— 算术运算
指针与整数的加减运算
-指针 p 加上或减去 n,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。
-这种运算的结果值取决于指针指向的数据类型。
指针加一,减一运算指向下一个或前一个数据。
例如,y=*px++ 相当于 y=*(px++) (*和 ++优先级相同,自右向左运算 )。
C语言程序设计 清华大学 郑莉 安颖莲
Page 8
pa
pa-2
pa-1
pa+1
pa+2
pa+3
*(pa-2)
*pa
*(pa+1)
*(pa+2)
*(pa+3)
*(pa-1)
short *pa
C语言程序设计 清华大学 郑莉 安颖莲
Page 9
pb-1
pb
pb+1
pb+2
*(pb-1)
*pb
*(pb+1)
*(pb+2)
long *pb
C语言程序设计 清华大学 郑莉 安颖莲
Page 10
关系运算
- 指向相同类型数据的指针之间可以进行各种关系运算。
- 指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。
- 指针可以和零之间进行等于或不等于的关系运算。
例如,p==0或 p!=0
赋值运算
- 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数 0,表示空指针。
指针变量
—— 关系运算和赋值运算
C语言程序设计 清华大学 郑莉 安颖莲
Page 11
指向数组元素的指针
定义与赋值例,int a[10];
int *pa;
pa=&a[0]; 或 pa=a;
通过指针引用数组元素经过上述定义及赋值后:
- *pa就是 a[0],*(pa+1)就是 a[1],...,*(pa+i)就是 a[i]。
- a[i],*(pa+i),*(a+i),pa[i]都是等效的。
- 不能写 a++,因为 a是数组首地址是常量。
例 2
C语言程序设计 清华大学 郑莉 安颖莲
Page 16
字符指针与字符串
字符指针的定义及使用
- 定义和初始化。
例,char *pa="ABC";
- 与数组不同,在程序中可以直接把字符串常量赋给一个指针变量。例:
char *name;
name="c program";
使用字符指针处理字符串
C语言程序设计 清华大学 郑莉 安颖莲
Page 17
指针数组
概念和定义例,static int *p[2];
由 p[0],p[1]两个指针组成
用指针数组处理二维数组的数据
指针数组的初始化
用指针数组处理多个字符串例 3
例 4
C语言程序设计 清华大学 郑莉 安颖莲
Page 23
指向数组的指针
指向一维数组的指针例:
int (*p)[4];
表示 p 所指对象是有 4个整型元素的数组。
指向多维数组的指针不作为基本要求
C语言程序设计 清华大学 郑莉 安颖莲
Page 24
多级指针
二级指针
- 说明形式:
存储类型 数据类型 **指针名
- 举例:
用二级指针处理多个字符串
三级以上的指针
- 不作为基本要求例 5
C语言程序设计 清华大学 郑莉 安颖莲
Page 27
以指针作为函数参数
以地址方式传递数据,可以用来返回函数处理结果。
命令行参数
main( argc,argv)
int argc; 命令名和所有参数个数之和
char *argv[]; 各元素是指针,分别指向各参数字符串例 6 例 7 例 8
C语言程序设计 清华大学 郑莉 安颖莲
Page 31
指针型函数当函数的返回值是地址时,该函数就是指针形函数
定义形式存储类型 数据类型 *函数名 ()
举例
P203 例 9.26
C语言程序设计 清华大学 郑莉 安颖莲
Page 32
指向函数的指针
定义形式存储类型 数据类型 (*函数指针名 )();
含义:
- 数据指针指向数据存储区,而函数指针指向的是程序代码存储区。
C语言程序设计 清华大学 郑莉 安颖莲
Page 33
指针小结
定义
- int *p; 指向整形量的指针。
- int *p[ ]; 指针数组,每个元素指向整形量。
- int (*p)[ ]; 一个指针,指向一维整形数组。
- int *p( ); 一个函数,返回指向整形的指针。
- int (*p)( ); 一个指针,指向返回值为整形数的函数。
- int **p; 二级指针。
指针在使用前一定要赋值
优缺点:
- 快速灵活、可实现动态存储分配;易出大错。
C语言程序设计 清华大学 郑莉 安颖莲
Page 34
作业
复习,9.1-9.5,9.7
P215 9.7,9.11,9.12
第九章其它题选做
Page 1
第六讲 指针参考书,C程序设计,第九章
C语言程序设计 清华大学 郑莉 安颖莲
Page 2
本讲主要内容
指针变量
指向数组元素的指针
字符指针与字符串
指针数组
指向一维数组的指针
多级指针
以指针作为函数参数
指针型函数
指向函数的指针
C语言程序设计 清华大学 郑莉 安颖莲
Page 3
定义例,static int i;
static int *i_pointer=&i;
指向整型变量的指针指针变量 — 概念及定义
概念
- 指针:另一个变量的地址用于间接访问变量
- 指针变量:
用于存放地址的变量
2000 3
i_pointer *i_pointer
i
2000
内存用户数据区变量 i
变量 j
变量
i_pointer
3
6
2000
2000
2002
3010
引用例 1,i=3;
例 2,*i_pointer=3;
C语言程序设计 清华大学 郑莉 安颖莲
Page 4
指针变量
—— 初始化
语法形式存储类型 数据类型 *指针名=初始地址;
例,int *pa=&a;
注意事项
- 用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。
- 可以用一个已赋初值的指针去初始化另一个指针变量。
- 不能用一个内部 auto 型变量去初始化 static 型指针。
例 1
C语言程序设计 清华大学 郑莉 安颖莲
Page 7
指针变量
—— 算术运算
指针与整数的加减运算
-指针 p 加上或减去 n,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。
-这种运算的结果值取决于指针指向的数据类型。
指针加一,减一运算指向下一个或前一个数据。
例如,y=*px++ 相当于 y=*(px++) (*和 ++优先级相同,自右向左运算 )。
C语言程序设计 清华大学 郑莉 安颖莲
Page 8
pa
pa-2
pa-1
pa+1
pa+2
pa+3
*(pa-2)
*pa
*(pa+1)
*(pa+2)
*(pa+3)
*(pa-1)
short *pa
C语言程序设计 清华大学 郑莉 安颖莲
Page 9
pb-1
pb
pb+1
pb+2
*(pb-1)
*pb
*(pb+1)
*(pb+2)
long *pb
C语言程序设计 清华大学 郑莉 安颖莲
Page 10
关系运算
- 指向相同类型数据的指针之间可以进行各种关系运算。
- 指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。
- 指针可以和零之间进行等于或不等于的关系运算。
例如,p==0或 p!=0
赋值运算
- 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数 0,表示空指针。
指针变量
—— 关系运算和赋值运算
C语言程序设计 清华大学 郑莉 安颖莲
Page 11
指向数组元素的指针
定义与赋值例,int a[10];
int *pa;
pa=&a[0]; 或 pa=a;
通过指针引用数组元素经过上述定义及赋值后:
- *pa就是 a[0],*(pa+1)就是 a[1],...,*(pa+i)就是 a[i]。
- a[i],*(pa+i),*(a+i),pa[i]都是等效的。
- 不能写 a++,因为 a是数组首地址是常量。
例 2
C语言程序设计 清华大学 郑莉 安颖莲
Page 16
字符指针与字符串
字符指针的定义及使用
- 定义和初始化。
例,char *pa="ABC";
- 与数组不同,在程序中可以直接把字符串常量赋给一个指针变量。例:
char *name;
name="c program";
使用字符指针处理字符串
C语言程序设计 清华大学 郑莉 安颖莲
Page 17
指针数组
概念和定义例,static int *p[2];
由 p[0],p[1]两个指针组成
用指针数组处理二维数组的数据
指针数组的初始化
用指针数组处理多个字符串例 3
例 4
C语言程序设计 清华大学 郑莉 安颖莲
Page 23
指向数组的指针
指向一维数组的指针例:
int (*p)[4];
表示 p 所指对象是有 4个整型元素的数组。
指向多维数组的指针不作为基本要求
C语言程序设计 清华大学 郑莉 安颖莲
Page 24
多级指针
二级指针
- 说明形式:
存储类型 数据类型 **指针名
- 举例:
用二级指针处理多个字符串
三级以上的指针
- 不作为基本要求例 5
C语言程序设计 清华大学 郑莉 安颖莲
Page 27
以指针作为函数参数
以地址方式传递数据,可以用来返回函数处理结果。
命令行参数
main( argc,argv)
int argc; 命令名和所有参数个数之和
char *argv[]; 各元素是指针,分别指向各参数字符串例 6 例 7 例 8
C语言程序设计 清华大学 郑莉 安颖莲
Page 31
指针型函数当函数的返回值是地址时,该函数就是指针形函数
定义形式存储类型 数据类型 *函数名 ()
举例
P203 例 9.26
C语言程序设计 清华大学 郑莉 安颖莲
Page 32
指向函数的指针
定义形式存储类型 数据类型 (*函数指针名 )();
含义:
- 数据指针指向数据存储区,而函数指针指向的是程序代码存储区。
C语言程序设计 清华大学 郑莉 安颖莲
Page 33
指针小结
定义
- int *p; 指向整形量的指针。
- int *p[ ]; 指针数组,每个元素指向整形量。
- int (*p)[ ]; 一个指针,指向一维整形数组。
- int *p( ); 一个函数,返回指向整形的指针。
- int (*p)( ); 一个指针,指向返回值为整形数的函数。
- int **p; 二级指针。
指针在使用前一定要赋值
优缺点:
- 快速灵活、可实现动态存储分配;易出大错。
C语言程序设计 清华大学 郑莉 安颖莲
Page 34
作业
复习,9.1-9.5,9.7
P215 9.7,9.11,9.12
第九章其它题选做