内容正文:
第9章 指 针
9.1 指针变量
9.2 数组指针变量
9.3 指针数组和二级指针变量
9.1.1变量的指针和指针变量
内存地址
变量的地址
int a=5,b=10;
2012
2010
3000
变量a
变量b
5
10
变量p
2010
一个存储单元首字节的编号称为该存储单元的“地址”,也就是相应变量的地址
在一个地址所标记的存储单元中存放的数据称为该存储单元的“内容”。
直接访问
间接访问
9.1.1变量的指针和指针变量
2012
2010
3000
变量a
变量b
5
10
变量p
2010
指针、变量的指针和指针变量
指针就是“内存单元的地址”
变量的指针就是“变量的地址”,它指向一个变量对应的内存单元。
保存指针(地址)数据的变量称为指针变量。
间接访问
9.1.2 指针变量的定义和初始化
定义指针变量的一般形式为:
类型标识符 *指针变量名;
如: int *ip;
char *cp;
指针变量也可进行初始化。
例如:int a ;
int *p=&a;
&a
a
p
9.1.3 指针变量的引用
指针变量同普通变量一样,使用之前不仅要定义,而且必须赋予具体的值。
两个有关的运算符:
取地址运算符“&”:形式为: &变量名
功能:得到变量的地址,为一指针。只能作用于变量。
例如: &x, &a[5] … 等是正确的应用
&25, &(k+1) … 等是错误的应用
指针运算符(或称“间接访问” 运算符)。
一般形式为: *指针变量名
如:*ip表示指针变量ip所指向的变量。
【例】指针运算符的示例。
main( )
{
int a=3,b=6, *pa=&a,*pb=&b;
printf("a=%2d,b=%2d
",a,b);
printf("*pa=%2d,*pb=%2d",*pa,*pb);
}
int a=3,b=6;
int *pa=&a,*pb=&b;
说明:“&”和“*”均为单目运算符,优先级别相同,且都具有右结合性.
&*pa与&a是等价的。
*&a与a是等价的。
2.对指针变量的赋值操作
可以通过赋值语句将一个有效的内存地址赋给已定义的指针变量
int a,*pa;
pa=&a; *pa=3;
说明:指向相同类型的指针变量之间可以相互赋值。
int a=3,*pa=&a,*pb;
pb=pa; *pb+=1;
int *p;
p=NULL;
或:p=0;
a+=1;
a=3;
NULL为系统定义的符号常量.代表整数0.
main()
{
int a,b,c,*pmax,*pmin;
printf("input three numbers:
");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{ pmax=&a;pmin=&b; }
else
{ pmax=&b; pmin=&a; }
if(c>*pmax) pmax=&c;
if(c<*pmin) pmin=&c;
printf("max=%d
min=%d
",*pmax,*pmin);
}
【例】利用指针变量求出三个数中的最大值和最小值。
a
10
15
3
b
c
&b
&a
pmin
pmax
a
10
15
3
b
c
&b
&c
pmin
pmax
【例】 使两个指针变量交换指向。
main()
{ int a1=10, a2=20;
int *p1, *p2, *p;
p1=&a1; p2=&a2;
printf(“ %d,%d,&d,&d
”,*p1,*p2,a1,a2);
p=p1; p1=p2; p2=p;
printf(“ %d,%d,%d,%d
”,*p1,*p2,a1,a2);
}
10,20,10,20
20,10,10,20
【例】 交换两个指针变量所指向的变量的值。
main()
{ int a1=10, a2=20, t;
int *p1, *p2;
p1=&a1; p2=&a2;
printf(“ %d,%d,%d,%d
”,*p1,*p2,a1,a2);
t=*p1; *p1=