《C语言程序设计》
C语言程序设计
第6章 指针
2015/9/15
第6章 指针
《C语言程序设计》
【学习目标】理解指针的概念掌握指针的使用与基本运算
重点掌握指针与一维数组重点掌握指针作为函数的参数
2015/9/15
第6章 指针
《C语言程序设计》
C程序设计中使用指针可以: – 使程序简洁、紧凑、高效 – 有效地表示复杂的数据结构 – 动态分配内存 – 得到多于一个的函数返回值
《C语言程序设计》
第6章 指针6.1 指针与指针变量 6.2 指针与数组 6.3 指针与函数
2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量内存0 …...
6.1.1 指针的概念
内存中每个字节有一个编号-----地址 程序中: int i;
P142
2000 2004 2008
i k
float k;编译或函数调用时为其分配内存单元
变量是对程序中数据 存储空间的抽象
…...
2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
指针
6.1.1 指针的概念
2.指针与指针变量 地址 内存单元 (1)指针: 2001 所谓指针就是某个 程序实体 ( 如变量、 数组或函数等 ) 所占 用的存储单元的首地 2005 址。 例如: int i=3,j=5;float f;2009
P143
整型变量i
整型变量j
单精度变量f
2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
6.1.1 指针的概念
(2)指针变量:
专门存放变量(或其它程序实体)地址的变量。特点: 地址是一种特殊的数据类型,所以存放地址 的指针变量和存放字符型、整型、实型数据的变 量是不同类型的变量。 指针变量也需要存储单元,它本身也有地 址。
2015/9/15
第6章 指针
《C语言程序设计》
指针与指针变量 指针:地址也是数据,这类数据就是~ 指针变量:专门存放地址的变量叫~ 指针 整型变量i 200010 变量的地址 指针变量 变量地址(指针)2004 2008 2012 …... …...
变量的内容地址存入 变量iPointer 指针变量
指向 变量 变量值2000
指针变量
《C语言程序设计》
6.1 指针与指针变量
6.1.1 指针的概念
3.变量地址的获取 由于变量的存储单元是在编译时(对静态存储变 量)或程序运行时(对动态存储变量)分配的,因 此变量的地址不能人为确定,而要通过取地址运算 符&获取。例如在如下的程序段中: char c;int i;float f; scanf("%d%f%c",&i,&f,&c); 注意:由于常量和表达式没有用户可操作的内存地 址,因此&不能作用到常量或表达式上。
P144
2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
6.1.1 指针的概念
4.直接访问与间接访问 (1)直接访问:按变量名或其地址存取变量值。 例如: int i; scanf(”%d”,&i); printf(“%d\n”,i); (2)间接访问:通过指针变量(如iPointer)访
问它 指向的变量(如 i )的方式叫间接访问方式。即先 找到存放“i的地址”的变量iPointer,从中取出i的 地址(2011),然后到2011、2012两个存储单元取出i 的值。2015/9/15
P144
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
6.1.2 指针变量的定义与初始化
P144 1.指针的类型 指针也是有类型的,指针的类型又称指针的基类型, 它的类型就是它所指向的程序实体(如变量、数组) 的类型,由此可确定程序实体所占内存的字节数。 2.指针变量的定义 对指针变量的定义包括三个内容: (1)指针类型说明,即定义变量为一个指针变量; (2)指针变量名; (3)变量值(指针)所指向的变量的数据类型。
2015/9/15
第6章 指针
《C语言程序设计》
表示定义指针变量
一般形式: 数据类型 * 指针名; 指针的目标变 量的数据类型 注意: 1、int *p1, *p2; 与 int 例
合法标识符
int *p1,*p2; float *q ; static char *name; *p1, p2;
2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量
4、指针变量定义后,变量值不确定,应用前必须先赋值
《C语言程序设计》
6.1 指针与指针变量
6.1.2 指针变量的定义与初始化
说明: P145 (1)“*”表示其后的变量是指针变量,而不是指针变 量名的一部分,即指针变量名是 p1 、 p2 、 p3 ,不是 *p1、*p2、*p3。 (2) 一个指针变量只能指向同类型的变量,如 p2 只 能指向浮点变量,不能时而指向一个浮点变量,时而 又指向一个整型或字符型变量。 (3) 指针变量中只能存放地址,不能将一个非地址 类型的数据(如常数)赋给一个指针变量,但0(NULL)除 外。例如: p1=100; /* 错误 */ p1=NULL; /* 正确*/ (4) 指针变量定义后,如果没有初始化,则变量值 是不确定的,使用前必须先赋值。2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
6.1.2 指针变量的定义与初始化
P145 3.指针变量的初始化 指针定义后,初始值为随机数,因此,使用之前不 仅要定义说明,而且必须赋予具体的值。 给指针变量赋地址值的方法有: 赋值号右侧是地址 在程序执行部分赋值。 不能赋非0常量值。 定义指针变量时初始化赋值。 定义指针变量时初始化赋值的形式为: 类型 *指针变量名 = &变量名,……; 例如: int a; int *p=&a; 或者: int a,*p=&a; 注意:“ & 变量名”中的“变量名”必须在指针变 量名之前定义。2015/9/15
第6章 指针
《C语言程序设计》
– 数据类型 *指针名=初始地址值; 赋给指针变量, 例 int i; 不是赋给目标变量 int *p=&i; 变量必须已说明过 例 int i; 类型应一致 例 int int *p=&i; *p=&i; int i;int *q=p; 用已初始化指 例 main(
) 针变量作初值 { int i; static int *p=&i; 不能用auto变量 .............. 的地址去初始化 } ( ) static型指针
《C语言程序设计》
6.1 指针与指针变量
6.1.3 指针变量的引用
C语言中提供了两个与指针有关的运算符:
P145
1. &:取地址运算符:作用是获得变量所占用的存 储单元的首地址(即该变量的地址)。例如:int a=10,*p;
p=&a;
/* &a表示变量a的地址 */
2. *:指针运算符(或称“间接访问运算符”):作用 是通过指针变量来访问它所指向变量的值 (取数据或存 数据)。例如: printf(“%d\n”,*p); /* 输出指针变量 p 所指向的变量a的值,*p与a等价,即10 */2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
6.1.3 指针变量的引用
说明: 在定义指针变量时,“ * ”表示其后是指针变量; 在执行部分的表达式中,“*”是指针运算符。 &和*都为单目运算符,优先级高于所有双目运算 符,与其他的单目运算符具有相同的优先级和结合性 (右结合性)。 &a不能出现在赋值号的左边。 运算符 & 只能用于变量和数组元素,不能用于表 达式或常量。运算符*只能作用于指针(地址)。 根据 * 运算符的作用, * 运算符和取地址运算符 & 互逆。即: *(&a)==a &(*p)==p2015/9/15
第6章 指针
《C语言程序设计》
6.1 指针与指针变量
6.1.3 指针变量的引用
说明:int a, *p=&a; scanf(“%d”,p); scanf(“%d”,&a);
P146
p、&a与&*p完全等价,即下面3个语句等价:都是地址值
scanf(“%d”,&*p); a、*p与*&a完全等价,即下面3个语句等价:
printf(“%d”,a) ;printf(“%d”,*p) ; printf(“%d”,*&a) ;2015/9/15
都是普通变量值
第6章 指针
《C语言程序设计》
– 直接访问与间接访问 直接访问:按变量名或变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量…... 2000 整型变量i
例
i=3;
-----直接访问
3 20 10
20042008 2012
变量iPointer2000
指针变量
例
*iPointer=20;
-----间接访问
…...