《C语言程序设计》第七章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
25 1020
... ...
81 1036
...
1000 2000
7.3 指针与数组(续)
❖第三次输出
p=&x[5];
x[0]
printf(“*p=%d\n“, *p);
x[1]
x[2]
x[3]
x[4] &x[5]
x[5]
...
x[9]
...
p
0
1000
1
1004
4
1008
9
1012
16
1016
... ...
81 1036
...
1000 2000
7.3 指针与数组(续)
❖ 第二次输出 p=&x[0]; printf(“*p=%d\n“, *p);
x x[0] x[1] x[2] x[3] x[4] x[5] ... x[9] ... p
0
1000
1
1004
4
1008
9
1012
16 1016
x = y;
y = temp;
printf("in swap:x=%d,y=%d\n", x, y);
}
void main()
{
int a = 3, b = 4;
swap(a, b);
printf("return to main:a=%d,b=%d\n", a, b);
}
7.2 指针作为函数参数(续)
7.1.2 定义指针变量(续)
▪ 另外,我们也可以在定义指针变量的同时对 其进行初始化。例如
• int c; • int *p=&c; /*将变量c的地址作为
指针变量p的初始值*/
▪ 注意:&运算符只能用于变量(包括指针变 量),但不能用于表达式、常量等。
7.1.2 定义指针变量(续)
2.*运算符 ▪ 运算符*是间接寻址或间接引用运算符。当 它作用于指针时,将访问指针所指向的变量 int x = 1, y = 2; int *ip; ip = &x; y = *ip; ▪ 最后一个语句相当于: y = x;
程序中并没有直接交换 变量var1和var2的值, 但是通过两个指针pVar1 和pVar2分别间接地访问 了变量var1和var2,从 而实现了两个变量值的 交换。
7.1.2 定义指针变量(续)
❖ 除了*和&运算符之外,赋值操作符也可以用 于指针变量。
❖ 只有相同类型的指针变量之间可以互相赋值。
临时变量tmp完成了交换。
它们之间的赋值之所以成立, 是由于三者的类型都是int*。
tmp = pVar1;
pVar1 = pVar2;
pVar2 = tmp;
printf("var1=%d, var2=%d\n", var1, var2);
printf("*pVar1=%d, *pVar2=%d\n", *pVar1, *pVar2);
7.1.3 指针的基本运算
❖ 1.&运算符 ▪ 定义指针变量后,编译器会为指针变量分配 存储空间,但并不会使指针变量指向一个数 据。在使用指针变量前,对其进行初始化是 至关重要的。一种初始化指针变量的方法是 将已经定义的变量的地址赋给它。为了得到 变量的地址,可以使用运算符&。 int *p,c; p = &c; /*将把c的地址赋值给变量p, p即为“指向变量c的指针” */
7.1.2 定义指针变量
❖ 指针变量定义的一般形式
类型名 *指针变量名;
❖ 例如: int *p; float *q;
5 a
1000
❖ 指针变量的含义
int a=5; int *pa=&a;
1000
2000
pa
pa
5
a
7.1.2 定义指针变量(续)
❖ 需要注意的是,指针变量是有类型之分的。 int *p; float *q; ▪ 通过变量p中存放的地址,可以找到另外一 个int类型的数据,而通过变量q中存放的地 址,找到的是一个float类型的数据。
本章学习目标
❖ 掌握指针的概念以及指针做函数参数的作用 ❖ 掌握通过指针对数组进行操作的方法 ❖ 掌握数组名做函数参数的含义和用法 ❖ 掌握通过指针对字符串进行操作的方法 ❖ 理解指针数组以及指向指针的指针的含义和作
用 ❖ 理解函数指针的作用
7.1 基本概念
❖7.1.1 指针和地址 ▪ 每一个字节对应唯一的一个编号。这个编号 实际上就是地址,通过某一个地址可以唯一 地定位到某一个字节。 ▪ 程序中使用的常量、变量在运行时要占据一 定数目的连续的内存单元,计算机就通过这 些内存单元的地址寻找并使用它们。 ▪ 有时,我们把某个变量的地址存储在另外的 变量里,这种存储了地址的变量我们通常称 之为指针变量。
{
int a = 3, b = 4;
swap(&a, &b);
printf("return to main:a=%d,b=%d\n", a, b);
}
7.2 指针作为函数参数(续)
❖ 程序执行过程
▪ 参数传递
• 实参分别是&a和&b,相应的形参px和py也被定 义为int* 类型
main
a
3 1000
7.1.2 定义指针变量(续)
【例7-1】通过指针变量访问变量
/* 程序7-1 */ #include <stdio.h> void main() {
int var1=1, var2=89, tmp; int *pVar1, *pVar2; pVar1 = &var1; pVar2 = &var2; tmp = *pVar1; *pVar1 = *pVar2; *pVar2 = tmp; printf("var1=%d, var2=%d\n", var1, var2); }
7.3 指针与数组
❖7.3.1 一维数组与指针 ▪ C语言中数组和指针的密切关系主要基于以 下两点事实:一是数组元素的存储方式,二 是数组名的意义。
▪ 数组元素的存储方式
char hi[]={'h','e','l','l','o'};
1000 1001 1002 1003 1004
'h'
hi[0]
❖ 程序执行过程 ▪ 参数传递
main
a
3
1000
b
4
1004
swap
x
3
2000
y
4
2004
te
...
201
m
0
p
7.2 指针作为函数参数(续)
▪ swap函数执行
main
a
3
b
4
1000 1004
swap
x
4
2000
y
3
2004
temp
...
201
0
7.2 指针作为函数参数(续)
▪ 返回main函数
b
4 1004
swap
px
1000 2000
py
1004 2004
temp
...
2010
7.2 指针作为函数参数(续)
▪ swap函数执行
• *px和*py就分别指向main函数中的变量a和b
main
a4 b3
1000 1004
swap
px 1000 2000
py
1004 2004
temp ...
'e'
hi[1]
'l'
hi[2]
'l'
hi[3]
'o'
hi[4]
7.3 指针与数组(续)
▪ 数组的名字代表数组首元素的地址。
• hi的值就是1000,因为hi[0]是从1000这个地址开 始存储的。数组名hi实际上是一个char* 类型的 指针,始终指向元素hi[0]。
• 我们也可以定义适当类型的指针变量,让指针变 量指向数组中的某个元素。
程序执行后输出结果为: *p=0 *p=0 *p=25
7.3 指针与数组(续)
❖ 第一次输出 p=x; printf(“*p=%d\n“, *p);
x x[0] x[1] x[2] x[3] x[4] x[5] ... x[9] ... p
0
1000012
16 1016
25 1020
普通高等教育计算机系列规划教材
第七章 指针
主要内容
1 基本概念 2 指针作为函数参数 3 指针与数组 4 指针与字符串 5 指针数组和指向指针的指针 6 指向函数的指针和返回指针的函数 7 应用实例
本章要点
❖ 指针与地址的概念 ❖ 指针变量与指针作为函数参数 ❖ 指针和数组的联系 ❖ 用指针处理字符串 ❖ 指针数组与指向指针的指针 ❖指针与函数
}
7.2 指针作为函数参数
❖ C语言中函数参数传递是值传递,形参值的改 变不会影响实参的值,因此在函数体里面无法 修改实参的值。
#include <stdio.h> void swap(int x,int y)
程序执行后输出结果为:
{ int temp; temp = x;
in swap:x=4,y=3 return to main:a=3,b=4
【例7-2】指针变量的赋值操作
/*程序7-2*/ #include <stdio.h> void main()
程序中变量var1和var2的值 并没有被交换,两个指针变
{
量pVar1和pVar2的值通过
int var1=1, var2=89; int *pVar1, *pVar2, *tmp; pVar1 = &var1; pVar2 = &var2;
程序执行后输出结果为: in swap:*px=4,*py=3
{ int temp;
return to main:a=4,b=3
temp = *px;
*px = *py;
*py = temp;
printf("in swap:*px=%d,*py=%d\n", *px, *py);
}
void main()
main
a
3
1000
b
4
1004
swap
x
xxx 2000
y
xxx 2004
temp
xxx 201 0
7.2 指针作为函数参数(续)
❖ 既然将变量名做实参的方式无法实现a、b的交 换,那么我们应该怎么才能达到目的呢?
【例7-3】指针做函数参数
/*程序7-3*/ #include <stdio.h> void swap(int *px,int *py)
7.3 指针与数组(续)
【例7-5】通过指针访问数组元素
/*程序7-5*/ #include <stdio.h> void main() {
int x[10], *p; int i; for(i=0;i<10;i++)
x[i]=i*i; /*第一次输出*/ p=x; printf(“*p=%d\n“, *p); /*第二次输出*/ p=&x[0]; printf(“*p=%d\n“, *p); /*第三次输出*/ p=&x[5]; printf(“*p=%d\n“, *p); }
7.2 指针作为函数参数(续)
❖ 可以通过指针从函数获得多个返回值。 【例 7-4】获取实数的整数和小数部分
/*程序7-4*/ #include <stdio.h> void worker(float x, int* pi, float* pj) {
*pi = (int)x; *pj = x - *pi; } void main() { float f = 3.1415; int i; float j; worker(f, &i, &j); printf(“%f :integer part is %d and decimal part is %f”,f, i, j); }
7.1.2 定义指针变量(续)
❖ 当指针变量ip指向变量x后,通过变量名可以 访问变量x,通过*ip也可以访问变量x,这是 两种等价的访问变量的方法。
❖ 通过变量名x访问变量是直接访问,编译器会 将变量名x映射为变量x的地址,通过地址直接 定位到变量x的存储空间。
❖ 借助于指针变量ip访问变量x是间接访问,这 时首先要访问指针变量ip,获取指针变量的值 即变量x的地址,然后通过变量x的地址访问变 量。
❖ 类型名限定的是指针变量指向的数据的类型。 int *p; /*p只能指向int类型数据*/ float *q; /*q只能指向float型数据*/ char *s; /*s只能指向char类型数据*/
7.1.2 定义指针变量(续)
❖ 指针变量也可以和其他变量一起定义。如: int a,b,*p,c[10];
2010
7.2 指针作为函数参数(续)
▪ 返回main函数
main
a
4 1000
b
3 1004
swap px xxx py xxx
2000 2004
temp xxx 2010
7.2 指针作为函数参数(续)
❖ 由此可见,通过指针作为参数,可以在被调用 函数中修改主调函数中定义的变量的值。但是 也要特别认清,这种做法实际上并没有改变C 语言中函数参数采用值传递这种事实,比如在 程序7-3中,虽然实参&a和形参px的值是一样 的,都是1000,但是&a和px并不等同。swap 函数只是利用形参px和py间接访问了main函 数中的变量a和b,但它并没有改变形参px和py 的值,而且如果形参px和py的值被改变了,这 种改变也不会引起实参值的改变。