内容正文:
第七章
地址和指针
问题的引入
int a=3;
使用指针有如下好处:
1101aff→
使程序简洁、紧凑、高效
↑
3
有效地表示复杂的数据结构
动态的分配地址
地址表示
得到多于一个的返回值
指针
7.1地址和指针的概念
计算机的内存是以字节为单位的一片连续的存储空间,每一个字节
都有一个编号,这个编号就称为内存的地址。
如果程序中定义了一个变量,C语言
地址
存储单元
变量名
地址
存储单元
的编译系统就会根据定义中的变量,为
100
100
A
ch
其分配一定字节数的内存单元
101
101
102
102
103
103
例如:
104
104
char ch 'A';
105
105
int i=5;
106
106
107
float f 3.8;
107
108
108
109
109
图7-1内存结构
图7-2变三的地址W
指针变量
指针变量的定义
p
int i,j,*p;
变量的值
存放的是地址
int i=3 *p;
p
p=&i;
i
&i
3
指针变量的引用
printf("%p",p);
假设有如下定义:
p=&a;
int i=3,a,*p;
scanf("%d",p);
p=&i;
scanf("%d",&a);
3
printf("%d",*p);
p
&a
printf("%d",a);
a
*p=5;
【例7.1】
下面的程
main()
序是指针变量的引
int i,j,*p,*q;
用,请认真体会引用
scanf("%d,%d",&i,&j);
的方法
p=&i;
9=&
&i
printf("%p,%pn",&i,p);
printf("%p,%pn",&j,q);
printf("%d,%dn",i,*p)
&i
printf("%d,%dn"j
q=p;
printf("%d,%d
",*p,*q);
printf("%d,%d
",i,j);
【例7.2】从键盘输入a和b两个整数,按照从大到
小的顺序输出排序后的结果。
main()
{
int a=5,b=9;
int p,*pa,*pb;
printf("%d,%dln",a,b);
pa-&a;
pb=&b;
if(*pa<*pb)
p=*pa;*pa=*pb;*pb=p;}
printf("%d,%d
",*pa,*pb);
}
问题的提出例将数从大到小输出
(main)
swap(int x,int y)
2000
int temp;
5
a
temp=x;
2002
9
b
X=y,
2004
y=temp;
swap)
2006
mainO
9
int a,b;
2008
5
scanf("%d,%d",&a &b);
200A
if(a<b)swap(a,b);
5
temp
printf("n%d,%d n",a,b)
问题的提出例将数从大到小输出
(main)
swap(int x,int y)
2000
int temp;
5
a
temp=x;
2002
9
b
X=y,
2004
y=temp:
值传递
2006
mainO
int a,b;
2008
scanf("%d,%d"&a&b):
200A
if(a<b)swap(a,b);
printf("n%d,%dn",a,b),
运行结果:5
例将数从大到小输出
(main)
2000
swap(int *pl,int *p2)
9
int p,
5
p=*pl;
004
2000
pointer_1
*pl=*p2;
006
2002
pointe
2
*p2=p}
2008
main()
200A
swap)
p1
int a,b;
200C
2000
2002
p2
int *pointer 1,*pointer 2;
200E
5
scanf("%d,%d",&a &b),
2010
p
pointer_1=&a;pointer 2=&b;
ia-bswaptpoimter_1,poimter 2),
printf("
%od,%d n",a,b),}