内容正文:
《C语言程序设计》
(清华大学出版)
同步教学
1
第九章 指 针
第9章 指 针(Pointer)
9.1 指针概述
9.2 指针与一维数组
9.3 指针与二维数组
9.4 指针与字符串
9.5 指针与函数
9.6 指针数组与多级指针
2
指针与数组关系密切,可通过指针来引用数组元素。
一维数组的指针:
数组中各元素所占连续存储单元的起始地址。
一维数组元素的指针:
该元素所占存储单元的首地址。
每个数组元素实质上就是一个变量。
9.2 指针与一维数组
第九章 指 针
3
p
p+1
int a[5]={2, 4, 23, 6, 78};
int *p;
p=a;
p+1
若是 :p++
基类型是 int , p+1相当于加上 4 个字节。
第九章 指 针
……..
4的高位字节
4的低位字节
2的高位字节
2的低位字节
2000
2004
2008
2012
2016
a[0]
a[1]
a[2]
a[3]
a[4]
23
6
78
p
4
数组名就是一个指针
只是不能修改这个指针的指向
可以定义函数的参数为数组
指针也可当作数组名使用
int *p, a[10];
p = a;
数组元素的几种等价引用形式
a[i]
*(a+i)
p[i]
*(p+i)
6000
6001
6002
6003
6004
6005
6006
6007
a[0]
a[1]
a[2]
a[3]
a
a+1
a+2
6000
6001
6002
6003
6004
6005
6006
6007
a[0]
a[1]
a[2]
a[3]
a
p
p++
p++
9.2 指针与一维数组
第九章 指 针
5
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
6
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
7
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
8
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
9
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
10
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
11
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
a 5 4 2 10 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
12
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
a 10 4 2 5 1
max
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
13
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
14
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
15
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
16
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
17
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
18
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
19
#include <stdio.h>
void main()
{ int i, t, a[5], *p, *max;
for(i=0; i<5; i++) scanf("%d", a+i); /* 输入数组 */
max=a; /* 使 max 指向数组的第1个元素 */
for(p=a+1; p<a+5; p++) if ( *max < *p) max = p;
t=*a; *a=*max; *max=t; /* 最大值与a[0]交换 */
for(p=a;p<a+5;p++) /* p指向数组第1个元素*/
printf("%3d",*p);
}
a 10 4 2 5 1
p
【例9.3】输入一组数据存放在数组中,找出最大值,使它与数组中的第1个元素的值交换位置,其余数据位置不变,并输出该组数。
第九章 指 针
9.2 指针与一维数组
20
#include <stdio.h>
void main()
{ int i,n,x;
/* 函数声明 */
void insert(int *a, int x, int *m);
int b[10]={2,3,6,9,21,30};
n=6; /*表示b中数据的个数*/
scanf("%d",&x); /*插入的数*/
insert(b, x, &n); /*函数调用*/
for(i=0; i<n; i++)
printf("%d ",b[i]);
printf("
");
}
【例9.5】编写函数,完成在有序数组中插入一个数,使数组仍然有序(升序)。
第九章 指 针
9.2 指针与一维数组
void insert(int *a, int x, int *m)
{
int i;
for(i=*m-1;i>=0;i--)
{ if(x<*(a+i))
*(a+i+1)=*(a+i);
else break;
}
*(a+i+1)=x;
(*m)++;
}
21
感谢观看
Thank you
22
$$