本次课内容:指针概念
教学目的:掌握指针的相关概念、地址、指
针、基类型;指针变量的定义,引用。
重点:相关概念、定义、引用。
难点:指针的指向、存储单元地址与存储单
元内容、存储单元地址的存储。
一、地址与指针
1、地址与取地址运算
地址,存储区域(内存)中第一个字节的编号 。
计算机内存是以字节为单位的一片连续的存储空间,每一个字
节都有一个编号,这个编号就称为内存地址。
内存中的存储空间是连续的,内存中的地址号也是连续的,并
用二进制数来表示(为方便描述,我们采用十进制表示地址) 。
在程序中定义了一个变量,C就会在内存为其分配一定字节的
内存空间。
注:如,int a,b;float x;
a=3,b=4;
x=8.6;
此时,a分配的单元为两个字节,第一个
字节的编号是 1010,故 a 的地址为 1010。
同理,变量 b的地址为 1012,变量 x的地
址为 1216。
变量的地址用 &运算符进行运算 。
如,&a 的结果为,1010。 地址 1010中的内容是 3。
1010
1012
1014
1216
1218
1220
a
b
x
3
4
8.6
2、指针与指针变量
程序中对变量的操作,实际上是对某个地址的存储单元进行操
作。这种 直接按变量的地址存取变量值的方式称为“直接存取”方
式 。
指针变量,用来存放内存地址的变量称为指针变量 。
设:指针变量 p中存放了变量 a的地址。则有如下图所示,
要访问 a 所代表的存储单元,可以
先找变量 p 的地址 1220,从中取出 a 的
地址,然后再去访问以 1010为首地址的
存储单元。
这种 通过指针变量先得到某变量地址,
然后再存取该变量值的方式称为“间接
存取“方式 。
通常称变量 p 指向了变量 a,所以
称 p 是指针变量( p 中存放了 a 的地址)。我们将 变量的“地址”
称为该变量的“指针” 。“指针”和“地址”是同一个意义。
a 3
4
1010
1012
1014
1220 p 1010
1010
1010 1011
a p
1220
二、指针的类型与指针的定义
指针变量的定义,
形式,类型名 *指针变量名 1,指针变量名 2,…;
如,int *pi,*pj;
说明,* 是说明符,用来说明该变量是指针变量;
int 是类型名,用来说明 pi 和 pj 是指向整型变量的指针。
指针的类型,指针所指向的变量的类型 。
int 也称为 pi, pj 的,基类型,
如,int *p; /*p中只能存放整型变量的地址 */
double *pd; /*pd中只能存放 double类型变量的地址 */
float *pf; /*pf中只能存放 float 类型变量的地址 */
char *st; /*st中只能存放字符类型变量的地址 */
又如,int *p,i,k;
i=3;
p=&i; /*将 i 的地址赋给指针变量 */
k=*p; /*将所指地址中的内容赋给 k*/
注,int *P ; 此时 *P表示指针类型,* 是指针类型说明符,在 非定义
中的 *p 为所指变量中存放的内容,在此例中代表存储单元 i 。
三、指针变量的引用
指针运算,& 运算符为取地址,如,&x 的值为 x 的地址。
* 运算符为指向,如,*P表示 P指向的变量。
如,int a,*P;
printf(“%o”,p); /*以八进制输出指针 P的地址 */
p=&a; /*P指向 a*/
scanf(“%d”,p); /*向 P指向的变量输入一个整数值 */
printf(“%d”,*P); /*输出 P所指向的变量的值 */
*P=5; /*将 5赋给 P所指向的变量 */
如,main()
{ int *p1,*p2,i1,i2;
scanf(“%d,%d”,&i1,&i2);
p1=&i1;p2=&i2;
printf(“%d,%d\n”,*p1,*p2);
p2=p1;
printf(“%d,%d\n”,*p1,*p2);
}
&i1 20
&i1 50
p1
p2
i1(*p)
i2(*p)
P2=p1
四、指向指针的指针
指向指针型数据的指针变量称指向指针的指针
定义:类型标识符 **指针变量名
如,int **p,*s,k=20;
s=&k;
p=&s;
*P 代表 S,*S代表 K,因此 **P代表 K。
&s &k
k s p
20
小结,
1、地址与指针
内存编号,指针与地址同意。
2、指针类型与定义
指向何种类型变量,则定义为该基类型。
指针变量用于存放变量的地址,从而指向这个变量。
3、指针变量引用
当指针变量指向某变量时,则可通过它间接访问该变量。
4、指向指针的指针
一个指针变量中存放另一个指针变量的地址,而被指向的指
针变量则又存放一个变量的地址。