c语言程序设计教程第六章指针

上传人:r*** 文档编号:43558897 上传时间:2018-06-06 格式:DOC 页数:12 大小:69.50KB
返回 下载 相关 举报
c语言程序设计教程第六章指针_第1页
第1页 / 共12页
c语言程序设计教程第六章指针_第2页
第2页 / 共12页
c语言程序设计教程第六章指针_第3页
第3页 / 共12页
c语言程序设计教程第六章指针_第4页
第4页 / 共12页
c语言程序设计教程第六章指针_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《c语言程序设计教程第六章指针》由会员分享,可在线阅读,更多相关《c语言程序设计教程第六章指针(12页珍藏版)》请在金锄头文库上搜索。

1、 本文由瓦斯 202 贡献ppt 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查看。第 6 章 指 针指针基础 指针与数组 指针与函数6.1 指针基础6.1.1 指针就是地址 1. 程序实体的内存地址 一个程序一经编译,在其执行过程中, 一个程序一经编译,在其执行过程中, 就会为变量、数组以及函数分配存储空间。 就会为 变量、数组以及函数分配存储空间。 这些变量、数组、函数都称为程序实体, 这些变量、 数组、函数都称为程序实体, 也具有某一种数据类型。 也具有某一种数据类型。这些被分 配了内 存空间的程序实体,都具有自己的内存地 存空间的程序实体, 址。#in

2、clude int main(void) int i1,i2; float f1,f2; double d1,d2; printf(“数 据大小:int,%d;float,%d;double,%dn“, sizeof(i1),sizeof(f1),sizeof(d1); /* 输出 类型宽度 */ printf(“%ld,%ldn“,/* 输出变量地址 */ printf(“%ld,%ldn“, printf(“%ld,%ldn“, return 0; 解释: (1)变量存储空间的分类顺序:先声明的后分 配;撤销的顺序与之相反:先 建立的后撤销。这种 机制就称为栈机制,好像往一个只能允许进出一

3、个 盘子的桶里放盘子, 先放进的后拿出。在 C 语言程序 中,局部变量就是被分配在栈区的,并且是以高端 为栈底 建立的。所以后建的变量的地址小。 (2)每个变量只有一个地址,但占用的空间不 同。 空间的大小因类型而异。同时,数据的存储方 式也不同,如实型数据采用浮点存储,而整 型数采 用定点存储。2. 指针的概念 从根本上说,目标程序是按照地址访 问这些程序实体的。C 语言不仅 提供了用变 量名访问内存数据的能力,还提供了直接 使用内存地址访问内存数据的能力。 这个 内存地址就称为指针。它好像一个指路标 指向要访问的内存数据。6.1.2 指针变量及其定义1. 指针变量的概念 变量可以用来存放数

4、值(如整数、实数等),也 可以用来存放地址 (另一个变量的地址),这种专 门用于存储指针(地址)的变量就称为指针变量。 2. 指针变 量的定义 在定义指针变量时,需要用指针声明符*表示 此变量不是一般的变量,而是用来 存放其他变量 地址的指针变量。由于每一个变量都是属于一个 特定类型的,因此在定义指 针变量时,需要声明 该变量的类型,以便能通过指针能正确访问特定 类型的数据。 定义 一个指针的语法格式为: 基类型标识符 * 指针变量名;6.1.2 指针变量及其定义int * pi1,*pi2; double *pd1,*pd2; 说明: (1) “基类型” ,就是指针要指向的数据 的类型。 (

5、2)定义指针变量时,在指针变量名前加符号 “*” 。 “*”称为指针声明符,用 于说明它后面 的名字是一个指针变量名。例如语句: int i1,i2,*pi1,*pi2; 定义了两个 数据变量 i1 和 i2,还定义了两个指 向 int 类型的指针 pi1 和 pi2。3. 指针变量的初始化和赋值和其他变量一样,指针变量也可以初始化。可以用变 量的地址对指针变量进行初始化, 但必须注意:该变量的 类型必须和指针变量的基类型相同。也可以用一个指针变 量的值给 另一个指针变量赋值,但它们应该具有相同的基 类型。例如: int i1,i2,i3; int *pi1= pi1= pi2=pi1; 注意

6、,不要将一个变量的值赋给指向它的指针变 量。 例如 pi1=i1;或 pi2=i1; 都是错误的。应该是将变量的地址赋给指向它的指针 变 量。如: pi1= pi = *pi=5; 此处 的“*”是“指针运算符” 。又称为“间 接访问运算符” ,它作用于指针变量。*pi 表示指 针变量 pi 所指向的存储空间,即变量 i。*pi 相当于 变量 i。2. 使用指针变量需要注意的问题 (1)使用指针,首先应当区分指针变量与它所指向 的存储单元之间的不同。 #include int main(void) int i1=10,i2=20,*p,*p1,*p2; p1=p2= printf (“i1=%

7、d,*p1=%d;i2=%d,*p2=%dn”,i1,*p1,i2,*p2); p=p1;p1=p2;p2=p; printf (“i1=%d,*p1=%d;i2=%d,*p2=%dn”,i1,*p1,i2,*p2); p1p1=p2= printf (“i1=%d,*p1=%d;i2=%d,*p2=%dn”,i1,*p1,i2,*p2); i=*p1;*p1=*p2;*p2=i; printf (“i1=%d,*p1=%d;i2=%d,*p2=%dn”,i1,*p1,i2,*p2); i=*p1 p1 int *px= 则通过“*”和“ ? 与小整数相加、减. (1)同类型指针间赋值 同类型

8、指针间赋值,就是 使一个指针指 向另外一个指针所指向的位置。#include int main(void) int i1,i2; int *pi1= printf(“指针间 赋值前: pi1=%ld,pi2=%ldn“,pi1,pi2); pi1=pi2; /* 指针间赋值 */ printf(“指针间赋值后: pi1=%ld,pi2=%ldn“,pi1,pi2); return 0; 运行结果: 指针间赋值前: pi1=215052,pi2=215048 指针间赋值后:pi1=215048,pi2=215048(2)指针与小整数相加、减 #include int main(void) int

9、 i,*pi; double d,*pd; pi=pd= printf(“pi=%ld,pi+1=%ldn“,pi,pi+1); printf(“pd=%ld,pd+1=%ldn“,pd,pd+1); return 0; 运行结果: pi=215052,pi+1=215056 pd=215040,pd+1=215048 通过指针与小整数的相加减去引用它所指 向的数据单 元是很危险的。指针变 量地址地址 指针变 量 1245040 pd赋值前赋值后pi1 pi21245048 1245052 1245056pd+1 pi pi+11245048 1245052 12450562. 同类型指针间的

10、比较和相减运算 指针间的的比较和相减运算,主要用于指向 同一 数组的两个元素的两个指针之间,例如有一 整型数组 a,如已定义: int a10; int*p1= 如 p1 的值为 2000,p2 的值为 2016,则 p2-p1 的 值不等于 16, 而等于两个数组元素下标之差,即 两个元素之间的元素个数。 指向同一数组不同元素的两 个指针之间的关 系运算,是比较它们之间的地址大小。如果 p1p2, 表示 p1 指向下标值 小的元素,p2. 指向下标值大的 元素。如果两个指针相等,表明它们指向同一数 组元素。6.1.5 指向指针变量的指针与多级指针一个指针变量可以指向一个整型数据, 或一个实型

11、数据,或一个字符型数据,也 可以 指向一个指针型数据。这就是指向指 针的指针。指向指针的指针形成二级指针。二级指针 一级指针 ppd pd doublel 类型ppipiint 类型#include int main(void) int i=8,*pi,*ppi; pi=ppi= printf(“ printf(“ printf(“i=%d,*pi=%ld,*ppi=%ldn”,i,*pi,*ppi); return 0; 运行结果:6.1.6 指向 void 类型的指针 指向 void 类型的指针ANSI C 标准允许使用空基类型(void)指针, 即不指定指针指向一个固定的类型,定义 形式

12、为: void *p; 这表示指针变量 p 不指向一个确定的类型数据。 它的作用仅仅是用来 存放一个地址,而不能指向 非 void 类型的变量。例如下面的写法是不对的: int *p1; void *p2; int i; p2= printf (%d,*p2);如果确实需要将 p1=(int *)p2; printf (%d,*p1); 注意:执行 p1=(int *)p2 后,p2 本身的类型并没有改变。 只是在 向 p1 赋值前先进行转换,生成一个(int *)型的临时数 据赋给 p1。 p1 也可以定义一个返 回基类型为 void 的指针的函数: void *f (int x,int y

13、) 函数 f 带回的是一个基类型为 “空”的地址。如果想在主调 函数中引用此地址,也需根据需要进行强制类型转换。例 如:int a,b; char *p; void *f(int,int); p=(char*)f(a,b);6.2 指针与数组6.2.1 数组元素的指针引用 1. 一维数组元素的指针引用 通过对数组的讨论,已经知 道数组元素在内 存是连续存储的,并通过下标引用数元素。下标 增 1,数据改变一个数据 单元位置。在学习了指针 之后,已经看到定义了一个指针后,可以通过指 针的移动来引用 连续的存储单元。前已说明,数 组名代表数组首元素的地址,即是一个指针。那 么,数组 元素和指针之间有

14、什么关系呢? C 语言的数组元素有两种引用方式:下标引 用方式和指针 引用方式。请看下面的例子。#include int main(void) int a5=1,3,5,7,9,i,*p; printf(“下标法:“); for(i=0;i%sn“,i, printf (“ (“ printf (“ printf(“n“);if (strcmp (string0,string1)0) p=string0;string0=string1;string1=p; if (strcmp (string0,string2)0) p=string0;string0=string2;string2=p; i

15、f (strcmp (string1,string2)0) p=string1;string1=string2;string2=p; printf (“排序后:n“); for(i=0;i%sn“,i, printf (“ printf (“ printf (“ printf(“n“); return 0; (2)本程序实际上说明了冒泡排序的 过程,并用 strcmp(stringI,stringj)进行 两 个字符串的比较。有了本例的基础,读者 可以编写出顺序输出 n 个字符串的程序,也 可以采用循环结构实现字符串的排序算法, 例如用选择法,起泡法等。 上例中,指针数组 string 的每一

16、个元素 都是一个地址(指向一个字符串),如果另外 设一个指针变量 p,用来 指向 string 数组中的 元素,那么这个 p 就是一个二级指针(又称 “双重指针”)。采用二级指针的字符串冒泡排序程序。#include #include #define N 3 int main ( ) char *stringN= “Java“,“Visual BASIC“,“C“; char *p= char *ptemp; int i,j; printf (“ 排序前:n“); for(i=0;i%sn“,i,*(p+i); printf(“n“); for(j=0;j0) ptemp=*(p+i);*(p+i)=*(p+i+1);*(p+i+1)=ptemp; printf (“排序后:n

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 小学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号