20110524-第十四讲(17-双14)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使程序简洁紧凑高效使程序简洁紧凑高效有效地表示复杂的数据结构有效地表示复杂的数据结构动态分配内存动态分配内存得到多于一个的函数返回值得到多于一个的函数返回值能象汇编语言一样处理内存地址从而编出精练而能象汇编语言一样处理内存地址从而编出精练而高效的程序高效的程序学习指针是学习c语言中最重要的一环学习指针是学习c语言中最重要的一环能否正确理解能否正确理解和使用指针是我们是否掌握c语言的一个标志可以说和使用指针是我们是否掌握c语言的一个标志可以说cc学习指针是学习c语言中最重要的一环学习指针是学习c语言中最重要的一环能否正确理解能否正确理解和使用指针是我们是否掌握c语言的一个标志可以说和使用指针是我们是否掌握c语言的一个标志可以说不懂不懂cc语言中的指针就不懂什么是语言中的指针就不懂什么是cc语言语言
教室号码
602 502 402 302 202 102
教室
50
…... …... …... …...
教室有容 量
…... …...
什么是指针
内存区的每一个字节有一个编号,这就是“地址 。 地址” 地址 如果在程序中定义了一个变量,在对程序进行编译时, 系统就会给这个变量分配内存单元。
例:有变量
变量pk 存放k pk中 int k; 变量pk中存放k在内存中的地址
例8 . 3 对输入的两个整数按大小顺序输出
解题思路:例8.2直接在主函数内交换指针变量的 解题思路:
值,本题是将指向两个变量的指针变量(内放两个 变量的地址)作为实参传递给形参的指针变量,在 形参中通过指针交换两个变量的值。
29-17Байду номын сангаас
#include <stdio.h> void main() {void swap(int * p1,int * p2); int a,b; int *pointer_1,*pointer_2; scanf(″%d,%d″,&a,&b); pointer_1=&a; pointer_2 =&b; if(a<b) swap(pointer_1,pointer_2); swap(pointer_1,pointer_2) printf(″\n%d,%d\n″,a,b); } void swap(int *p1,int *p2)
i_pointer = &i =&(*i_pointer) &(*i_pointer) i_pointer &i ii = *i_pointer = *(&i) *i_pointer *(&i)
变量i 变量i_pointer 指针变量
i_pointer-----指针变量 i_pointer-----指针变量,它的内容是地址量 指针变量, *i_pointer----指针的目标变量,它的内容是数据 i_pointer----指针的目标变量, 指针的目标变量 &i_pointer---指针变量占用内存的地址 i_pointer---指针变量占用内存的地址
3、指针变量的定义 一般形式: 一般形式: 例
[存储类型] 存储类型] 基类型 *变量名; 变量名;
int *p1, *p2; 指针变量本身的存储类型 指针的目标变量的数据类型 合法标识符 float *q; 表示定义指针变量 不是‘ 不是‘ static char *name; *’运算符
注意: 注意: int *p1, *p2; 与 int *p1, p2; 指针变量名是p1,p2 ,不是 不是* 指针变量名是p1,p2 ,不是*p1,*p2 指针变量只能指向定义时所规定类型的变量 指针变量定义后,变量值不确定, 指针变量定义后,变量值不确定,应用前必须先赋值
变量a的定义在后, 变量a的定义在后,对a的引 用超出了a 用超出了a的作用域
pc不能指向非字符型变量 pc不能指向非字符型变量 赋值语句中,被赋值的指针 赋值语句中, 变量p的前面不能再加“ 变量p的前面不能再加“*” 说明符
例
例
不允许直接把一个数赋值给 指针变量
29-13
5、引用指针变量 格式: *指针变量
指针变量p 指针变量p 2000 2000 指针变量q 指针变量q
…... …...
29-12
指针变量赋值的几种错误方法: 指针变量赋值的几种错误方法: 例 例 int *p = &a; int a; int a; int *pi = &a; char *pc = &a; int a; int *p; *p = &a; int *p; p = 2000;
int a; int *p = &a; *p = 10;
// p指向a p指向 指向a // 相当于 a = 10;
int a, *p; p = &a; *p = 10; a++; printf ("a = %d, *p = %d", a, *p);
输出结果: 输出结果: a = 11, *p = 11
变量必须已说明过 变量必须已说明过 类型应一致 类型应一致
用已初始化指针变量作初值
29-11
赋值语句赋值 例 int a; int *p; p = &a;
… …
2000 …... …...
整型变量a 整型变量a
20 …... …...
例 int a = 20 ; int *p, *q; p = &a; q = p;
注意:程序在利用指针间接引用内存单元时,将按照指 注意:程序在利用指针间接引用内存单元时, 可写成(*p)++,而不是* 可写成(*p)++,而不是*p++ 针变量定义时所指向的数据类型来解释引用的内存单元。 针变量定义时所指向的数据类型来解释引用的内存单元。
29-14
【例】输入两个数,并使其从大到小输出 输入两个数,
{ int temp; temp=*p1; *p1=*p2; *p2=temp; }
29-19
例8.5 输入a、b、c 3个整数,按大小顺序输出。 输入a、b、c 个整数,按大小顺序输出。 个整数 #include <stdio.h> void main() { void exchange(int *q1,int *q2,int *q3); int a,b,c,*p1,*p2,*p3; scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf("\n%d,%d,%d\n",a,b,c); }
指针变量只能指向定义时所规定类型的变量。 指针变量只能指向定义时所规定类型的变量。 运行结果: 运行结果: 指针变量也是变量, 指针变量也是变量,在内存中也要占用一定的内存单 a=5, b=9 元,但所有类型的指针变量都占用同样大小的内存单 max=9, min=5 其具体大小取决于所使用的编译环境,如在BC3.1 元,其具体大小取决于所使用的编译环境,如在BC3.1 VC6.0下为 个字节, TC2.0下为 个字节。 下为4 下为2 和VC6.0下为4个字节,在TC2.0下为2个字节
int k=100
100 2008
int *pk
2008
变量pk 是一个指针变量,存放k的地址,称指向K 变量pk 是一个指针变量,存放k的地址,称指向K。
指针就是地址! 指针就是地址! 指针变量就是存放地址的变量! 指针变量就是存放地址的变量!
指针和指针变量的定义: 指针和指针变量的定义:
一个变量的地址称为该变量的“指针”。 例如,地址2000是变量i的指针。如果有一个变 量专门用来存放另一变量的地址(即指针),则 它称为“指针变量”。上述的i_pointer就是一 个指针变量。
指针变量的定义和引用
1、变量值的存取方法 直接访问: 直接访问:按变量名来存取变量值 间接访问: 间接访问:通过存放变量地址的变量去访问变量
…... 整型变量i
例 i = 3;
-----直接访问 -----直接访问
2000 2001 2002 2003 2004 2005 2006 …... 2000 20 3 10
void swap(int *pt1, int *pt2) { int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; }
练 习
以下程序的运行结果是 #include <stdio.h> sub(int x,int y,int *z) {*z=y-x;} void main( ) {int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf("%d,%d,%d\n",a,b,c); } -5,-12,-7
指
针
指针是C语言中广泛使用的一种数据类型。 运用指针编 指针是C语言中广泛使用的一种数据类型。 程是C语言最主要的风格之一。 程是C语言最主要的风格之一。 程序设计中使用指针可以: C程序设计中使用指针可以: 使程序简洁、紧凑、 ① 使程序简洁、紧凑、高效 ② 有效地表示复杂的数据结构 ③ 动态分配内存 ④ 得到多于一个的函数返回值 能象汇编语言一样处理内存地址, ⑤ 能象汇编语言一样处理内存地址,从而编出精练而 高效的程序 学习指针是学习C语言中最重要的一环, 能否正确理解 学习指针是学习C语言中最重要的一环, 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 语言中的指针就不懂什么是C语言。 C语言中的指针就不懂什么是C语言。
29-1
主要内容
什么是指针 指针变量 通过指针引用数组 通过指针引用字符串
教学楼
存储地址
内存
0 …... …... 2000 2001 2002 2003 2004
存储2005 数据 存储单元有 大小( 大小(字节单 字单元) 元、字单元) 存储 单元
601 501 401 301 201 101
用函数实现改变这3个变量的值 void exchange(int *q1, int *q2, int *q3) { void swap(int *pt1, int *pt2); if(*q1<*q2) swap(q1,q2); if(*q1<*q3) swap(q1,q3); if(*q2<*q3) swap(q2,q3); }
#include <stdio.h> void main ( ) { 指针变量p1 指针变量p1 2000 2008 2006 int *p1,*p2,*p, a, b; 指针变量p2 指针变量p2 2002 scanf ("%d,%d", &a, &b); 2008 2006 指针变量p 指针变量p p1 = &a; p2 = &b; 2004 2006 if (a < b) 整型变量a 整型变量a 2006 5 重点强调: 重点强调: { p = p1; p1 = p2; p2 = p; } 整型变量b 整型变量b 2008 printf ("a = %d, b = %d\n",,后赋值,最后才能使用!没有 %d\ 9 指针变量必须先定义,b); 指针变量必须先定义 a, 后赋值,最后才能使用! printf ("max = %d, min = %d\n", %d\ 赋值的指针变量是没有任何意义的, 赋值的指针变量是没有任何意义的,也绝对是不允许 *p1, *p2); 使用的。 } 使用的。
…...
…...
29-15
说明: 说明 (1) *&a的含义是什么? &a的含义是什么 &a的含义是什么? 先进行&a运算,得a的地址,再进行*运算。 *&a和*p1的作用是一样的,它们都等价于变量a。即 *&a与a等价。 (2) (*p1)++相当于a++。 相当于a 。 ) 相当于
29-16
指针变量作为函数参数 函数的参数不仅可以是整型、浮点型、字符 型等数据,还可以是指针类型。它的作用是 将一个变量的地址传送到另一个函数中。
&与*运算符 与 运算符
含义 两者关系:互为逆运算 含义: 理解 含义: 取变量的地址 含义: 含义: 取指针所指向变量的内容
…... …... i_pointer 2000 *i_pointer 10 i
&i_pointer 单目运算符 单目运算符 结合性: 结合性:自右向左 结合性: 结合性:自右向左 整型变量i 2000 2001 2002 2003 2004 2005 2006 …... …... 2000 10
变量i 变量i_pointer 指针变量
例 *i_pointer = 20; 20;
-----间接访问 -----间接访问
29-9
2、指针变量与其所指向的变量之间的关系
i_pointer 2000 变量i 变量i 3 *i_pointer i &i i=3; *i_pointer i_pointer *i_pointer=3;
4、指针变量的赋值 初始化赋值
[存储类型] 基类型 *指针名 = 初始地址值; 存储类型] 初始地址值;
例
赋给指针变量, 赋给指针变量, int i; int *p = &i; 不是赋给目标变量 &i;
例 例 int i; int *p = &i; &i; int int i; &i; *p = &i; int *q = p;
教室号码
602 502 402 302 202 102
教室
50
…... …... …... …...
教室有容 量
…... …...
什么是指针
内存区的每一个字节有一个编号,这就是“地址 。 地址” 地址 如果在程序中定义了一个变量,在对程序进行编译时, 系统就会给这个变量分配内存单元。
例:有变量
变量pk 存放k pk中 int k; 变量pk中存放k在内存中的地址
例8 . 3 对输入的两个整数按大小顺序输出
解题思路:例8.2直接在主函数内交换指针变量的 解题思路:
值,本题是将指向两个变量的指针变量(内放两个 变量的地址)作为实参传递给形参的指针变量,在 形参中通过指针交换两个变量的值。
29-17Байду номын сангаас
#include <stdio.h> void main() {void swap(int * p1,int * p2); int a,b; int *pointer_1,*pointer_2; scanf(″%d,%d″,&a,&b); pointer_1=&a; pointer_2 =&b; if(a<b) swap(pointer_1,pointer_2); swap(pointer_1,pointer_2) printf(″\n%d,%d\n″,a,b); } void swap(int *p1,int *p2)
i_pointer = &i =&(*i_pointer) &(*i_pointer) i_pointer &i ii = *i_pointer = *(&i) *i_pointer *(&i)
变量i 变量i_pointer 指针变量
i_pointer-----指针变量 i_pointer-----指针变量,它的内容是地址量 指针变量, *i_pointer----指针的目标变量,它的内容是数据 i_pointer----指针的目标变量, 指针的目标变量 &i_pointer---指针变量占用内存的地址 i_pointer---指针变量占用内存的地址
3、指针变量的定义 一般形式: 一般形式: 例
[存储类型] 存储类型] 基类型 *变量名; 变量名;
int *p1, *p2; 指针变量本身的存储类型 指针的目标变量的数据类型 合法标识符 float *q; 表示定义指针变量 不是‘ 不是‘ static char *name; *’运算符
注意: 注意: int *p1, *p2; 与 int *p1, p2; 指针变量名是p1,p2 ,不是 不是* 指针变量名是p1,p2 ,不是*p1,*p2 指针变量只能指向定义时所规定类型的变量 指针变量定义后,变量值不确定, 指针变量定义后,变量值不确定,应用前必须先赋值
变量a的定义在后, 变量a的定义在后,对a的引 用超出了a 用超出了a的作用域
pc不能指向非字符型变量 pc不能指向非字符型变量 赋值语句中,被赋值的指针 赋值语句中, 变量p的前面不能再加“ 变量p的前面不能再加“*” 说明符
例
例
不允许直接把一个数赋值给 指针变量
29-13
5、引用指针变量 格式: *指针变量
指针变量p 指针变量p 2000 2000 指针变量q 指针变量q
…... …...
29-12
指针变量赋值的几种错误方法: 指针变量赋值的几种错误方法: 例 例 int *p = &a; int a; int a; int *pi = &a; char *pc = &a; int a; int *p; *p = &a; int *p; p = 2000;
int a; int *p = &a; *p = 10;
// p指向a p指向 指向a // 相当于 a = 10;
int a, *p; p = &a; *p = 10; a++; printf ("a = %d, *p = %d", a, *p);
输出结果: 输出结果: a = 11, *p = 11
变量必须已说明过 变量必须已说明过 类型应一致 类型应一致
用已初始化指针变量作初值
29-11
赋值语句赋值 例 int a; int *p; p = &a;
… …
2000 …... …...
整型变量a 整型变量a
20 …... …...
例 int a = 20 ; int *p, *q; p = &a; q = p;
注意:程序在利用指针间接引用内存单元时,将按照指 注意:程序在利用指针间接引用内存单元时, 可写成(*p)++,而不是* 可写成(*p)++,而不是*p++ 针变量定义时所指向的数据类型来解释引用的内存单元。 针变量定义时所指向的数据类型来解释引用的内存单元。
29-14
【例】输入两个数,并使其从大到小输出 输入两个数,
{ int temp; temp=*p1; *p1=*p2; *p2=temp; }
29-19
例8.5 输入a、b、c 3个整数,按大小顺序输出。 输入a、b、c 个整数,按大小顺序输出。 个整数 #include <stdio.h> void main() { void exchange(int *q1,int *q2,int *q3); int a,b,c,*p1,*p2,*p3; scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf("\n%d,%d,%d\n",a,b,c); }
指针变量只能指向定义时所规定类型的变量。 指针变量只能指向定义时所规定类型的变量。 运行结果: 运行结果: 指针变量也是变量, 指针变量也是变量,在内存中也要占用一定的内存单 a=5, b=9 元,但所有类型的指针变量都占用同样大小的内存单 max=9, min=5 其具体大小取决于所使用的编译环境,如在BC3.1 元,其具体大小取决于所使用的编译环境,如在BC3.1 VC6.0下为 个字节, TC2.0下为 个字节。 下为4 下为2 和VC6.0下为4个字节,在TC2.0下为2个字节
int k=100
100 2008
int *pk
2008
变量pk 是一个指针变量,存放k的地址,称指向K 变量pk 是一个指针变量,存放k的地址,称指向K。
指针就是地址! 指针就是地址! 指针变量就是存放地址的变量! 指针变量就是存放地址的变量!
指针和指针变量的定义: 指针和指针变量的定义:
一个变量的地址称为该变量的“指针”。 例如,地址2000是变量i的指针。如果有一个变 量专门用来存放另一变量的地址(即指针),则 它称为“指针变量”。上述的i_pointer就是一 个指针变量。
指针变量的定义和引用
1、变量值的存取方法 直接访问: 直接访问:按变量名来存取变量值 间接访问: 间接访问:通过存放变量地址的变量去访问变量
…... 整型变量i
例 i = 3;
-----直接访问 -----直接访问
2000 2001 2002 2003 2004 2005 2006 …... 2000 20 3 10
void swap(int *pt1, int *pt2) { int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; }
练 习
以下程序的运行结果是 #include <stdio.h> sub(int x,int y,int *z) {*z=y-x;} void main( ) {int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf("%d,%d,%d\n",a,b,c); } -5,-12,-7
指
针
指针是C语言中广泛使用的一种数据类型。 运用指针编 指针是C语言中广泛使用的一种数据类型。 程是C语言最主要的风格之一。 程是C语言最主要的风格之一。 程序设计中使用指针可以: C程序设计中使用指针可以: 使程序简洁、紧凑、 ① 使程序简洁、紧凑、高效 ② 有效地表示复杂的数据结构 ③ 动态分配内存 ④ 得到多于一个的函数返回值 能象汇编语言一样处理内存地址, ⑤ 能象汇编语言一样处理内存地址,从而编出精练而 高效的程序 学习指针是学习C语言中最重要的一环, 能否正确理解 学习指针是学习C语言中最重要的一环, 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 语言中的指针就不懂什么是C语言。 C语言中的指针就不懂什么是C语言。
29-1
主要内容
什么是指针 指针变量 通过指针引用数组 通过指针引用字符串
教学楼
存储地址
内存
0 …... …... 2000 2001 2002 2003 2004
存储2005 数据 存储单元有 大小( 大小(字节单 字单元) 元、字单元) 存储 单元
601 501 401 301 201 101
用函数实现改变这3个变量的值 void exchange(int *q1, int *q2, int *q3) { void swap(int *pt1, int *pt2); if(*q1<*q2) swap(q1,q2); if(*q1<*q3) swap(q1,q3); if(*q2<*q3) swap(q2,q3); }
#include <stdio.h> void main ( ) { 指针变量p1 指针变量p1 2000 2008 2006 int *p1,*p2,*p, a, b; 指针变量p2 指针变量p2 2002 scanf ("%d,%d", &a, &b); 2008 2006 指针变量p 指针变量p p1 = &a; p2 = &b; 2004 2006 if (a < b) 整型变量a 整型变量a 2006 5 重点强调: 重点强调: { p = p1; p1 = p2; p2 = p; } 整型变量b 整型变量b 2008 printf ("a = %d, b = %d\n",,后赋值,最后才能使用!没有 %d\ 9 指针变量必须先定义,b); 指针变量必须先定义 a, 后赋值,最后才能使用! printf ("max = %d, min = %d\n", %d\ 赋值的指针变量是没有任何意义的, 赋值的指针变量是没有任何意义的,也绝对是不允许 *p1, *p2); 使用的。 } 使用的。
…...
…...
29-15
说明: 说明 (1) *&a的含义是什么? &a的含义是什么 &a的含义是什么? 先进行&a运算,得a的地址,再进行*运算。 *&a和*p1的作用是一样的,它们都等价于变量a。即 *&a与a等价。 (2) (*p1)++相当于a++。 相当于a 。 ) 相当于
29-16
指针变量作为函数参数 函数的参数不仅可以是整型、浮点型、字符 型等数据,还可以是指针类型。它的作用是 将一个变量的地址传送到另一个函数中。
&与*运算符 与 运算符
含义 两者关系:互为逆运算 含义: 理解 含义: 取变量的地址 含义: 含义: 取指针所指向变量的内容
…... …... i_pointer 2000 *i_pointer 10 i
&i_pointer 单目运算符 单目运算符 结合性: 结合性:自右向左 结合性: 结合性:自右向左 整型变量i 2000 2001 2002 2003 2004 2005 2006 …... …... 2000 10
变量i 变量i_pointer 指针变量
例 *i_pointer = 20; 20;
-----间接访问 -----间接访问
29-9
2、指针变量与其所指向的变量之间的关系
i_pointer 2000 变量i 变量i 3 *i_pointer i &i i=3; *i_pointer i_pointer *i_pointer=3;
4、指针变量的赋值 初始化赋值
[存储类型] 基类型 *指针名 = 初始地址值; 存储类型] 初始地址值;
例
赋给指针变量, 赋给指针变量, int i; int *p = &i; 不是赋给目标变量 &i;
例 例 int i; int *p = &i; &i; int int i; &i; *p = &i; int *q = p;