c语言程序设计第9章课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ int a[3][4]={{0,1,2,3},{10,11,12,13},{20,21,22,23}}, i, j, *p;
for (p=a[0], i=0; i< 3; i++)
{ for (j=0; j< 4; j++)
printf("%4d",*(p+i*4+j)); /* 元素的相对位置为i*4+j */
1
C 语言程序设计
第8章 指 针
池州师专 计算机中心
第8章 指针
2
8.1 指针和指针变量 8.2 指针与数组 8.3 指针与函数
2019/6/16
8.1 指针和指针变量
8.1.1 指针和指针变量的概念
变量的两个物理意义 变量的内容 变量的地址
main()
x
{float x; int y;
…
}
y
3
2019/6/16
8.2 指针与数组
19
8.2.1 指向数组的指针
2. 二维数组的指针
a[0]+1 a[0]+2 a[0]+3
a[0]数组 0 1 2 3 a[1]数组 10 11 12 13 a[2]数组 20 21 22 23
⑵ 二维数组元素的地址
a[2]+1 a[2]+2 a[2]+3
a[0]、a[1]、a[2]是一维数组名, 所以a[i]+j是数组元素的地址。
a
赋值运算 p
main()
{int a,*p; x float x,*q;
p = &a;
q = &x;
… }
q
×*p = &a;
7
2000 5
2001 2002 2000 2003 2004 2005 2006 2007 2008 2004 2009
2019/6/16
8.1 指针和指针变量
8
方法1:目标变量值不变,改变指针变量的
3
.
4
.
5
.
6
7
.
8
.
9
.
10 a[9]
2019/6/16
8.2 指针与数组
17
【例8.4】输入五个整数,使用指针变量将这五个数
按从小到大排序后输出。
main( )
输入a数组
{ int a[5],*pp,*p,*q,t; for (p=a; p<a+5;p++)
scanf("%d",p); for (p=a; p<a+4; p++) { pp=p;
数组元素a[i][j]的地址可以表示为下列形式:
&a[i][j]、a[i]+j 、*(a+i)+j
2019/6/16
8.2 指针与数组
20
8.2.1 指向数组的指针
2. 二维数组的指针
a a[0] a[1] a[2]
⑶ 二维数组元素的表示法
0 1 23 10 11 12 13 20 21 22 23
printf("%4d ",*(p+i)); 1 2 3 4 5 6 7 8 9 10 printf("\n"); }
a 1 a[0]
2 3 4 5 6 7 8 9
10 a[9]
2019/6/16
8.2 指针与数组
8.2.1 指向数组的指针
1. 一维数组的指针
p
【例8.3】用指针法输出数组元素。
main( ) { int a[10], i, *p;
for (q=p+1; q<a+5; q++) if (*pp>*q) pp=q;
if (pp!=p)
for (p=a; p<a+4; p++)
pp=p
for (q=p+1; q<a+5; q++)
T *pp>*q F
pp=q
T
pp!=p
F
*pp*p
输出a数组
{ t=*p;*p=*pp;*pp=t; } }
指【向例求8解.1】。输入a、b两个整数,
m使a用in指( 针)变量按大小顺序输出
a
6
b
8
{这两in个t 整a,数b。,*p1,*p2,*p;
p1=&a;p2=&b;
p1
p2
scanf(″%d%d″,p1,p2);
if(*p1<*p2)
p
{ p=p1; p1=p2; p2=p;}
printf(″a=%d,b=%d\n″,a,b);
“●间变接量存的取地”址称…为变量的指针
方●式存放地址的变} 量称为指针变量
a和b相加的结果(*p=a+b)存放
a
2000 5
2001
b 3 2002 2003
c 8 2004 2005
p
2006
2004 2007
到变量p所指向的内存单元中去。 p
c
此时c称为指针变量p的目标变量。 2004 p=&c
2019/6/16
8.1 指针和指针变量
8.1.2 指针变量的定义
指针变量定义的形式 指针变量初始化
main() {int a,*p;
float x,*q; p = &a; q = &x;
… }
main() { int a,*p=&a;
float x,*q=&x; … }
6
a
2000
2001
p
2002
printf("\n");
}
}
2019/6/16
8.2 指针与数组
22
8.2.1 指向数组的指针
2. 二维数组的指针 ⑸ 指向一维数组的指针变量
指向一维数组指针变量的定义形式: 数据类型标识符 (*变量名)[元素个数]
数组元素的指针表示法: *(a+0),*(a+1), … ,*(a+i), … ,*(a+9)
12
a a[0]
a[9]
2019/6/16
8.2 指针与数组
8.2.1 指向数组的指针
1. 一维数组的指针
p
⑵ 指向一维数组元素的指针变量
由于数组元素也是一个内存变量,所 以此类指针变量的定义和使用与指向变量 的指针变量相同。例如:int a[10],*p;
2000 2001 2002 2003 2004 2005 …
2019/6/16
8.1 指针和指针变量
8.1.1 指针和指针变量的概念
main()
利用变量名
{int a,b,c;
存取数据的方式
a=5; b=3; c=a +b;
直接将整数 5称存为入“变直量接a 存取 ”方式。
直接将整数 3 存入变量 b
1. 一维数组的指针
p
【例8.3】用指针法输出数组元素。 main( ) { int a[10], i, *p; for (i=0; i<10; i++)
scanf("%d", a+i); for (i=0; i<10; i++)
printf("%4d ",*(a+i)); printf("\n"); for (p=a,i=0; i<10; i++) 1 2 3 4 5 6 7 8 9 10
for (p=a; p<a+10; p++) scanf("%d",p);
for (p=a; p<a+10; p++) printf("%d ",*p);
printf("\n"); }
15
a 1 a[0] 2 3 4 5 6 7 8 9 10 a[9]
2019/6/16
8.2 指针与数组
16
8.2.1 指向数组的指针
⑴ 二维数组的地址
例如:int a[3][4];
① 二维数组名a是数组的首地址。
② 二维数组a包含三个行元素:a[0]、a[1]、a[2] 。
三个行元素的地址分别是:a、a+1、a+2。
而a[0]、a[1]、a[2]也是地址量,是一维数组名,
即*(a+0)、*(a+1)、*(a+2)是一维数组首个元素地址。
2000 2003
x
2004
2005
2006
2007
q
2008
2004 2009
2019/6/16
8.1 指针和指针变量
8.1.3 指针的基本运算
间接存取运算
main() { int a,*p=&a;
float x,*q=&x; *p = 5; printf("a+3=%d\n",*p+3); … }
a[2]
② 指针变量可加减一个整型表达式。如:
pp③r1+i指+n、t针fp的(2″+加3p减、1运p=2%算-u-、,是*p以p21-基2=。%类d\型n为″单,p位1(,*即p1); a[3]
sipz2eo+f=(3类; 型))的。
a[p两r个in指tf针(″变量p2P指=1%向=u4同,0*一4p,2数*=p组%1d=时\1n,0″进,行p2指,*针p2变); 量}相减才有实P际2意=4义1。0,如*p:2=p24-0p1。
p = a;(或 p = &a[0];) 当p指向a[0]时,用p表示数组元素
下标法: p[0],p[1], … ,p[i], … ,p[9] 指针法: *(p+0),*(p+1), … ,*(p+i), … ,*(p+9)
13
a a[0]
a[9]
2019/6/16
8.2 指针与数组
14
8.2.1 指向数组的指针
printf(″max=%d,min=%d\n″,*p1,*p2); a=6,b=8
}
max=8,min=6
2019/6/16
8.1 指针和指针变量
9
方法2:利用指针变量直接改变目标变量的值 求解。
main() { int a,b,t,*p1,*p2;
p1=&a;p2=&b; scanf(″%d%d″,p1,p2); if(*p1<*p2) { t=*p1; *p1=*p2; *p2=t;} printf(″a=%d,b=%d\n″,a,b);
8.2 指针与数组
21
8.2.1 指向数组的指针 p
a0 1 23
2. 二维数组的指针
10 11 12 13
⑷ 指向二维数组元素的指针变量 20 21 22 23
【例这8种.5】指用针指变向量数的组定元义素及的使指用针与变指量向输一出维数数组组元元素素。的
指针ma变in量( )是相同的,用它存放二维数组元素的地址。
数组元素可用下列形式表示: a[i][j]、*(a[i]+j)、*(*(a+i)+j)
a 是二维数组,根据C的地址计算方法,a经过 两次 * 操作才能访问到数组元素。所以
* a 是 a[0],* * a 才是 a[0][0]。 a[0]是a[0][0]的地址,*a[0]是a[0][0]。
2019/6/16
2019/6/16
8.2 指针与数组
8.2.1 指向数组的指针
1. 一维数组的指针
p
例如: int a[10],*p; ⑴ 数组名是该数组的指针
a是数组的首地址(即a[0]的地址),是一 个指针常量。 a = &a[0],a+1 = &a[1], … ,a+9 = &a[9]
数组元素的下标表示法: a[0],a[1], … ,a[i], … ,a[9]
…
直接将变量 a、b 的值
}
取出,相加后存入变量 c
4
a 5 2000 2001
b 3 2002 2003
c 8 2004 2005
2019/6/16
8.1 指针和指针变量
5
8.1.1 指针和指针变量的概念
C 语言 main()
还提供了对 {int a=5,b=3,c,*p;
内存单元的
p = &c; *p = a + b;
10
10 404 405
20 406 407
30 408 409
40 410 411
50 412 413
2019/6/16
8.1 指针和指针变量
8.1.3 指针的基本运算 指针的关系运算
p1
a[0]
p2
① 指向同一数组的两个指针可以进行关系 a[1]
运算,表明它们所指向元素的相互位置关系 。
如:p2 > p1、p2 == p1。
a[2]
② 指针与一个整型数据进行比较是没有意
义的 。 ③ 不同类型指针变量之间比较是非法的。
a[3]
④ NULL可以与任何类型指针进行==、!=
的关系运算,用于判断指针是否为空指针 。 a[4]
11
10 404 405
20 406 407
30 408 409
40 410 411
50 412 413
a、*p1 b、*p2
86
68
p1
p2
t 6
printf(″max=%d,min=%d\n″,*p1,*p2); }
a=8,b=6 max=8,min=6
2019/6/16
8.1 指针和指针变量
8.1.3 指针的基本运算 指针的加减运算
p1
a[0]
p2
main()
a[1]
{指①in针只t有加a当[减]指=运{针1算变0,要量20点指,3向:0数,4组0,时5指0}针,*的p加1,减*p2; 运p算1=才p2有=a意;义。
数组名是地址,指向数组的指针变量存放的也是地址。
数通过组指名针和变指量向也数可以组引的用指数针组变元量素。的p区= 别&a[:0] 等效a 于 p = a。
指针变量p是变量可以赋值, p
1 a[0] 2 a[1]
数组用名指a针是变地量址引常用量数不组能元赋素值,。 必须关注其当前值。例如: p=p+3 *(p-1)、p[-1]等价于a[2]
图8.9 选择法排序N-S图
for (p=a; p<a+5; p++)
printf("%d ",*p);
printf("\n");
}
2019/6/16
8.2 指针与数组
18
8.2.1 指向数组的指针
2. 二维数组的指针
a a[0] a+1 a[1] a+2 a[2]
a0 1 2 3 10 11 12 13 20 21 22 23