第7章_指针-1(指针变量做参数、字符指针).ppt_第1页
第7章_指针-1(指针变量做参数、字符指针).ppt_第2页
第7章_指针-1(指针变量做参数、字符指针).ppt_第3页
第7章_指针-1(指针变量做参数、字符指针).ppt_第4页
第7章_指针-1(指针变量做参数、字符指针).ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 指针,指针是C语言的一个重要概念,也是C语言的重要特色。 通过指针可以表示复杂的数据结构;实现动态分配内存;方便处理字符串;有效地访问数组;能带出函数的多个运算结果;能直接处理内存地址等。 掌握指针的应用,可使程序简洁、紧凑、高效!不掌握指针就没掌握C的精华!,第7章 指针 7.1 指针概述 7.2 指针和数组间的关系 7.3 指针数组 7.4 带参数的main()函数 7.5 动态数组的实现,7.1 指针(Pointer)概述,一、问题的提出 -为什么需要使用指针? 例:编写函数实现两数的交换,void Swap(int x,int y) int temp; temp = x; x

2、= y; y = temp; ,#include void Swap(int x,int y); int main(void) int a, b; a = 15; b = 8; Swap(a, b); printf(a=%d,b=%d,a,b); return 0; ,该程序能实现两数的交换吗?,二、地址和指针的概念,(一) 内存单元的地址 和其中的内容 内存单元的地址 计算机的内部存储器是由若干个单元组成的,每一个单元中可存放一个字节的信息。为了能区分不同的单元,对这些单元分别编号,此编号即为内存单元的地址。,声明变量时必须理解变量名、类型、所占字节数、地址,2. 指针及指针变量 指针(也叫

3、变量的指针): 在C中,将地址形象化地称为指针。一个变量的地址称为该变量的指针。 指针变量: 在C中,有一种特殊的变量,它是专门用来存放另一个变量地址的变量,我们称它为指针变量。 指向(也叫指针所指变量): 通过指针变量中的指针(地址)值所能找到的变量单元,称之为:地址“指向”变量单元(也叫指针所指变量)。 int a = 10, *p; p = ,10, (可以存放整型变量的地址) float *pointer_3; (可以存放实型变量的地址) char *pointer_4; (可以存放字符型变量的地址),指针变量能存放任意类型的地址吗?,int i,*p; p=,int *p; floa

4、t *q; p=q;,int i; float *p; p=,int a=5,*p; p=a;,判断是对?是错?,指针变量只 存放地址!,一个指针变量不能指向与其类型不同的变量!,我是正确的, 你猜对了吗?,应在类型相同的指针变量之间赋值,2. p = ,(1) int i = 3, *p; p = ,例 1: 通过指针变量访问整型变量 (在调试状态下查看各变量的值) #include int main(void ) int a, b; int *p1, *p2; a = 100; b = 10; p1 = ,四、 指针的运算,(一)关系运算 指向同一种数据类型的两个指针变量才能进行关系运算

5、值为1(真)或0(假) p q p q p = q 注意:是判断地址的大小,而绝对不是数据值的大小。 不能与非指针类型变量进行比较,但可与NULL(为指针常量,即空(0)值)进行等或不等的关系运算 判断p是否为空指针 P = NULL p != NULL,(二)赋值运算 1.指针变量的赋值赋地址 指针变量在使用前一定要赋值;为指针变量赋的值必须是一个地址。,int main(void) int *p; scanf(%d, p); ,int main(void) int a,*p = ,错! 但TC下不报错 VC下报错,例如:理解如下指针变量的赋值结果: int main(void) int a

6、 = 10, b = 20, *p, *q; p = ,2. 指针所指变量的赋值赋数据 格式: *指针变量名 = 例如: int main(void) int a , b, *p, *q; p = ,五、指针变量作为函数参数,函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传到另一个函数中_单向传址。 1、函数的声明形式: 函数结果类型名 函数名(类型名 *指针变量) ; 注意:函数的形参为指针类型,它用来接受函数调用时对应实参的地址。 2、函数的调用形式: 函数名(指针变量名 | int main(void) double x1; f( /*调用函数

7、时实参为变量地址*/ void f(double *p) /*函数的形式参数为指针变量*/ ,形参指针变量p 指向实参变量x1,void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp; ,int main(void) int a, b; a = 15; b = 8; Swap( ,void Swap(int x,int y) int temp; temp = x; x = y; y = temp; ,int main(void) int a, b; a = 15; b = 8; Swap(a, b); printf(a=

8、%d,b=%d,a,b); return 0; ,程序 1,程序 2,例1:编写函数实现两数的互换,实 参,形 参,结果有何不同?,Not Work!Why?,主调函数,被调函数,int main(void) int a, b; a = 15; b = 8; Swap(a, b); printf(a=%d,b=%d,a,b); return 0; ,void Swap(int x, int y) int temp; temp = x; x = y; y = temp; ,15,a,b,实 参,形 参,8,程序 1,x,y,temp,实参传值给形参,主调函数,被调函数,int main(void

9、) int a, b; a = 15; b = 8; Swap( ,void Swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp; , int main(void) double r, ll, cc, ss; printf(Please input r data:); scanf(%lf, ,Double Circle(double r, double *c1, double *s1) double l1; l1 = 2 * r; *c1 = 2 * PI * r; *s1 = PI * r * r; return l1;

10、注意:该函数计算的圆直径值是用return字句带出函数的,而圆的周长和面积值是通过指针带出函数的!,swap函数的几种错误形式(1/2),参数单向传递 #include void Swap(int *p1, int *p2); int main(void) int a, b; a = 15; b = 8; Swap( ,void Swap(int *p1, int *p2) int *p; p = p1; p1 = p2; p2 = p; ,为什么是错的呢?它到底交换的是啥?,swap函数的几种错误形式(2/2),指针p没有确切的地址 #include void Swap(int *p1, i

11、nt *p2); int main(void) int a, b; a = 15; b = 8; Swap( ,void Swap(int *p1, int *p2) int *p; *p = *p1; *p1 = *p2; *p2 = *p; ,它又交换的是啥东东呢?,void sub1(char a, char b) char c; c=a; a=b; b=c; void sub2(char *a, char b) char c; c=*a; *a=b; b=c;void sub3(char *a, char *b) char c; c=*a; *a=*b; *b=c; ,以下程序的输出结

12、果是( )。,#include void sub1(char a, char b); void sub2(char *a, char b); void sub3(char *a, char *b); int main(void)char a, b; a=A; b=B; sub3 ( ,六、字符指针作为函数参数,(一)串的表示:字符数组或字符指针 C语言并没有为字符串提供任何专门的表示法,完全是使用字符数组和字符指针来处理字符串。 字符串 一串以0结尾的字符 字符数组 每个元素都是字符类型的数组 char string100; 字符指针 指向字符类型的指针 char *p;,(二)字符指针变量与

13、字符数组的区别,1、定义方法不同 char str10; char *ptr; 2、赋值方法不同 char str10; str = ”china”; /*错误*/ strcpy(str,”china”); /*正确*/ char *ptr; ptr = ”china”;,(三)使用字符指针的注意事项,字符指针变量必须有明确的指向,否则使用是危险的。(思考:为什么呢?) 例如,输入字符串时 char *a; scanf(%s, a); /*错误*/ 应为: char *a; char str10; a = str; scanf(%s, a); /*正确*/,#include void MySt

14、rcpy(char *p2, const char *p1) while (*p1 != 0) *p2 = *p1; p1+; p2+; *p2 = 0; ,例1:字符串拷贝用字符指针编程,int main(void) char a80, b80; printf(“Please enter a string:”); gets(a); MyStrcpy(b,a); printf(“The copy is:”); puts(b); return 0; ,当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为const,例2:P808 .c 两个字符串的交错插入连接-用字符指针编程实现。

15、,#include #define N 128 void conj(char *string1, char *string2) ; int main(void) char str1N * 2, str2N; printf(Please input string1:); gets(str1); printf(Please input string2:); gets(str2); conj(str1, str2); printf(nstring1:%sn, str1); return 0; ,void conj(char *string1, char *string2) char bakN * 2, *p1, *q1; int i; i = 0; p1 = string1; q1 = string2; for ( ; *p1 != 0 ,while (*q1 != 0) baki = *q1; i+; q1+; baki = 0; p1 = string1; for (i = 0; baki != 0; i+, p1+) *p1 = baki; *p1 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论