第9章 指针

合集下载

C语言实验-第七章-第九章2

C语言实验-第七章-第九章2

实验七:指针的应用【实验目的】1.掌握指针和指针变量,内存单元和地址、变量与地址、数组与地址的关系;2.掌握指针变量的定义和初始化,指针变量的引用方式;3.能正确使用数组的指针和指向数组的指针变量;【实验内容】1.填空题输入一个字符串,将其中的大写字母转换成小写字母,然后输出本程序主要是比较scanf()输入和gets()输入的区别#include <stdio.h>void main(){ char s[20];char *p=s;scanf(“%s”,p); /*注意用scanf()输入和gets()输入的区别*/while( 1 ){if( 2 ) *p=*p+ (‘a’-‘A’);p++ ;}puts ( 3 );}答案:1、*p!=’\0’2、(*p>='A')&&(*p<='Z')3、s运行结果:输入:Program输出:program输入:This is Program输出:this提示:scanf ()输入时遇到空格认为字符串结束,用gets()输入时只有遇到回车才认为字符串结束。

如键入any boy并回车,则2。

补充程序题输入15个整数存入一维数组,再按逆序重新调整该数组中元素的顺序然后再输出。

下面给出部分程序的内容,请将程序补充完整,然后上机调试。

部分程序清单如下:#include <stdio.h>void main(){ int a[15],*p1,*p2,x;for(p1=a;p1<a+15;p1++)scanf("%d",p1);for(p1=a,p2=a+14;p1<a+7;p1++,p2--){ x=*p1;*p1=*p2;*p2=x;}……}答案:for(p1=a;p1!=a+15;p1++)printf("%d ",*p1); // %d后面有一个空格运行结果:输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15输出:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1提示:(1)在整型数组中,没有结束标志,必须依靠数组中数据元素的个数控制循环次数。

《C语言程序设计教程(第二版)》 第09章-指针(1)

《C语言程序设计教程(第二版)》 第09章-指针(1)

访问p_int所 指向的变量
getch();
}
程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p
2019/2/22
11
1、指针变量的定义
指针变量的定义标识符
数据类型 *指针变量[,*指针变量2……];
例如, [案例9.1]中的语句:
int num_int=12, *p_int ;
特别说明:定义而未初始化的指针变量(例如 p_int)是悬空的。
使用悬空指针变量,很容易破坏系统,导致系统 瘫痪。
2019/2/22
12
2、取地址运算 : &变量名 例 如 , [ 案 例 9.1] 中 的 &num_int 、 &num_f 、 &num_ch 的结果,分别为对应变量的地址 (num_int 、 num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的 地址。 例如, [案例9.1]中的指针变量p_int、p_f、p_ch, 只能接收int型、float型、char型变量的地址,否则出 错。
使p_int指向变量num_int
2019/2/22
10
printf(“num_int=%d, *p_int=%d\n”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2f\n”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%c\n”, num_ch, *p_ch);
9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数

计算机二级c语言第九章 数组和指针习题与答案

计算机二级c语言第九章 数组和指针习题与答案

第九章数组和指针1、有以下程序main(){ int a[]={2,4,6,8,10}, y=0, x, *p;p=&a[1];for(x= 1; x< 3; x++) y += p[x];printf("%d\n",y);}程序运行后的输出结果是A)10 B)11 C)14 D)152、有以下程序void sum(int a[]){ a[0] = a[-1]+a[1]; }main(){ int a[10]={1,2,3,4,5,6,7,8,9,10};sum(&a[2]);printf("%d\n", a[2]);}程序运行后的输出结果是A)6 B)7 C)5 D)83、有以下程序main(){int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;while(i++< 7) if(p[i]%2) j+=p[i];printf("%d\n",j);}程序运行后的输出结果是A)42 B)45 C)56 D)604、设有定义语句 int x[6]={2,4,6,8,5,7},*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是A)for(i=0;i<6;i++) printf("%2d",*(p++));B)for(i=0;i<6;i++) printf("%2d",*(p+i));C)for(i=0;i<6;i++) printf("%2d",*p++);D)for(i=0;i<6;i++) printf("%2d",(*p)++);5、有以下程序#include < stdio.h >main(){ int a[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL; *q=*(p+5);printf("%d %d\n",*p,*q); }程序运行后的输出结果是A)运行后报错 B)6 6 C)6 11 D)5 106、有以下程序段int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;b=p[5];b中的值是A)5 B)6 C)8 D)97、已有定义:int i,a[10],*p;则合法的赋值语句是A)p=100; B)p=a[5]; C)p=a[2]+2; D)p=a+2;8、以下能正确定义一维数组的选项是A)int num []; B)#define N 100int num [N];C)int num[0..100]; D)int N=100;int num[N];9、有以下程序main(){ int p[7]={11,13,14,15,16,17,18},i=0,k=0;while(i< 7&&p[i]%2){k=k+p[i];i++;}printf("%d\n",k);}执行后输出结果是A)58 B)56 C)45 D)2410、有以下程序main(){ int x[8]={8,7,6,5,0,0},*s;s=x+3;printf("%d\n",s[2]);}执行后输出结果是A)随机值 B)0 C)5 D)611、若有定义:int aa[8];。

《计算机操作系统》课件第9章 (2)

《计算机操作系统》课件第9章 (2)

第9章 文件管理
记录式文件是指文件由若干记录组成,每个记录可赋予 一个标识,称为键,记录式文件又可分为可变长记录文件和 定长记录文件。
描述文件的逻辑结构时要包括对文件的存取方法的定义。 用户对不同逻辑结构的文件采用不同的存取方法,以便对文 件进行各种操作。常用的存取方法有顺序存取、随机存取和 按键存取三种方法。
(2) 把一个文件划分成几个能独立存取的顺序子文件, 这样,各个顺序子文件只需占用相对较少的连续磁盘块,容 易得到满足。由于各顺序子程序是可独立存取的,所以,经 这样划分后的文件结构,本质上仍是顺序文件。
第9章 文件管理
2. 链接结构 把逻辑文件中的各个逻辑记录任意存放到一些磁盘块中, 这些磁盘块可以分散在磁盘的任意位置。例如,有5个逻辑 记录的某文件,存放到磁盘上需占用5个磁盘块,这五个磁 盘块的块号可以是9,16,1,10,25。于是,顺序的逻辑记 录被存放在非顺序的磁盘块上。如果用指针把这些磁盘块按 逻辑记录的顺序链接起来,则形成了文件的链接结构,把链 接结构的文件称为“链接文件”或“串联文件”。
第9章 文件管理
9.1 文件和文件系统 9.2 文件结构 9.3 文件存储空间的管理 9.4 文件目录管理 9.5 文件的共享和保护 9.6 文件操作和使用 9.7 文件管理实现举例 习题
第9章 文件管理
9.1 文件和文件系统
9.1.1 文件
文件是在逻辑上具有完整意义的信息的集合,它以是实现非连续存储的另一种方法,索引结构为 每个文件建立一张“索引表”,在索引表中记载每个逻辑记 录的存放位置的指针。通常,把索引表保存在某个磁盘块中, 文件目录中指出索引表的存放位置。采用索引结构的文件称 为“索引文件”。 索引表中的每个表项指出一个逻辑记录的存放位置,可 以按逻辑记录的顺序登记在索引表中。这样,第i个表项就表 示了第i个逻辑记录所在的位置。当索引表中的表项数大于逻 辑记录个数时,可用特殊字符(比如“-1”)表示无效登记项。

计算机操作系统课后答案第9章习题解答

计算机操作系统课后答案第9章习题解答

第9章习题解答一、填空1.MS-DOS操作系统由BOOT、IO.SYS、MSDOS.SYS以及 所组成。

2.MS-DOS的一个进程,由程序(包括代码、数据和堆栈)、程序段前缀以及环境块三部分组成。

3.MS-DOS向用户提供了两种控制作业运行的方式,一种是批处理方式,一种是命令处理方式。

4.MS-DOS存储管理规定,从地址0开始每16个字节为一个“节”,它是进行存储分配的单位。

5.MS-DOS在每个内存分区的前面都开辟一个16个字节的区域,在它里面存放该分区的尺寸和使用信息。

这个区域被称为是一个内存分区所对应的内存控制块。

6.MS-DOS有4个存储区域,它们是:常规内存区、上位内存区、高端内存区和扩充内存区。

7.“簇”是MS-DOS进行磁盘存储空间分配的单位,它所含扇区数必须是2的整数次方。

8.当一个目录表里仅包含“.”和“..”时,意味该目录表为空。

9.在MS-DOS里,用文件名打开文件,随后就通过句柄来访问该文件了。

10.在MS-DOS里,把字符设备视为设备文件。

二、选择1.下面对DOS的说法中,B 是正确的。

A.内、外部命令都常驻内存B.内部命令常驻内存,外部命令非常驻内存C.内、外部命令都非常驻内存D.内部命令非常驻内存,外部命令常驻内存2.DOS进程的程序,在内存里 D 存放在一起。

A.总是和程序段前缀以及环境块B.和谁都不C.总是和进程的环境块D.总是和程序段前缀3.MS-DOS启动时能够自动执行的批处理文件名是: C 。

A.CONFIG.SYS B.MSDOS.SYSC.AUTOEXEC.BAT D.4.下面所列的内存分配算法, D 不是MS-DOS采用的。

A.最佳适应法B.最先适应法C.最后适应法D.最坏适应法5.在MS-DOS里,从1024K到1088K的存储区域被称为 D 区。

A.上位内存B.扩展内存C.扩充内存D.高端内存6.MS-DOS的存储管理是对A的管理。

A.常规内存B.常规内存和上位内存C.常规内存和扩展内存D.常规内存和扩充内存7.在下面给出的MS-DOS常用扩展名中,B 不表示一个可执行文件。

第9章 指针

第9章 指针

第9章指针指针是C语言的精华,指针让C语言威力无穷,魅力四射。

为什么scanf函数的实参有时要加一个&操作符,有时却不加?为什么数组作为参数时就可以改变实参的值?这些前面遗留的问题都与指针有关,这些问题的答案均可在本章中找到。

指针是C语言中特殊的数据类型。

整型变量所标识的存储单元中存放整数,浮点型变量中存放浮点数,那么指针变量所标识的存储单元中存放的显然是指针,但是指针是什么呢?9.1 指针类型9.1.1 变量的左值和右值变量用于标识存储单元。

计算机中的内存以字节为单位编号。

编号多为32位的二进制数,从0号开始,即0x0000 0000、0x0000 0001、……、0xffff ffff。

计算机中只用内存编号(又称内存地址)标识内存单元。

如果定义并初始化了一个整型变量如int i = 5;,则计算机中的内存状态可能如图9-1所示。

图9-1 变量i的内存状态图从图9-1可知,整型变量i所标识的存储单元共4个字节,通常以存储单元的首字节地址作为该存储单元的地址,即整型变量i所标识的存储单元的地址为0x0012 ff00,类型为整型。

当取变量i的值时,计算机会把从0x0012 ff00处开始的4个字节作为一个整体,取出其中的内容,然后按整型解码最终得到变量i的值为5。

存储单元如宿舍,其地址像宿舍号(如408),其存储的内容如住宿者(如王五),相关变量名如宿舍的雅称(如liaozhai)。

由以上分析可知,变量既标识存储单元的地址又标识其存储的内容,因此变量比如整型变量i也有两个值。

整型变量i的一个值是地址0x0012 ff00,另一个值是内容5。

变量i在使用时表现为何值呢?例9-1分析语句i = 5; j = i;中整型变量i的值。

分析:语句i = 5;的操作结果是把5放入变量i所标识的存储单元中,也就是把5的补码存入地址为0x0012 ff00的存储单元中,变量i的值此时实为地址0x0012 ff00。

C语言程序设计-杨路明第9章课件

C语言程序设计-杨路明第9章课件
现在定义了一个结构体数组students,它有3个元素,又定义了一个结构体变量 student1,则下面的赋值合法。 student1=students[0]; students[2]=students[1]; students[1]=student1;
9.3.3 结构体数组的使用
(3) 不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成 员对象进行输入输出。例如:
/*学号*/
char name[20]; /*姓名*/
char sex;
/*性别*/
int age;
/*年龄*/
float score;
/*C成绩*/
char addr[40];
};
注:‘;’不能省
结构体类型定义描述结构 的组织形式,不分配内存
9.1 结构体类型的定义
例如,考虑10门课程成绩, 加上总成绩与平均成绩,可作如下定义:
struct是关键字,不能省略
struct
[结构体类型名] {
成员说明列表: ……….
}
成员类型可以是 基本型或构造型
9.1 结构体类型的定义
实例:定义结构体类型,描述下列数据 (1) 学生情况: 包含学生的学号、 姓名、 性别、 年龄、C语言课程成绩,地址:
struct student
{ int num;
输出stud变量,应该使用如下方式:
应该如何输出stud变量?
printf(″%s,%s,%ld\n″,,stud.addr,stud.num); 输入stud变量的各成员值,则用:
scanf(″%s%s%ld″,,stud.addr,&stud.num);
9.3 结构体类型数组
9.4.2 指向结构体数组元素的指针

第九章习题及答案

第九章习题及答案

第九章习题一、选择题1.以下选项中不能正确把cl定义成结构体变量的是( )A)typedef struct B)struct color cl{ int red; { int red;int green; int green;int blue; int blue;} COLOR; COLOR cl; };C)struct color D)struct{ int red; { int red;int green; int green;int blue; int blue;} cl; } cl;2.有以下说明和定义语句struct student{ int age; char num[8];};struct student stu[3]={{20,"200401"},{21,"200402"},{10\9,"200403"}};struct student *p=stu;以下选项中引用结构体变量成员的表达式错误的是( )A) (p++)->num B)p->num C)(*p).num D)stu[3].age3.有以下结构体说明、变量定义和赋值语句struct STD{char name[10];int age;char sex;}s[5],*ps;ps=&s[0];则以下scanf函数调用语句中错误引用结构体变量成员的是( )。

A)scanf(“%s”,s[0].name);B)scanf(“%d”,&s[0].age);C)scanf(“%c”,&(ps->sex)); D)scanf(“%d”,ps->age);4.以下叙述中错误的是()A)可以通过typedef增加新的类型B)可以用typedef将已存在的类型用一个新的名字来代表C)用typedef定义新的类型名后,原有类型名仍有效D)用typedef可以为各种类型起别名,但不能为变量起别名5.有以下程序段()typedef struct node { int data; struct node *next; } *NODE;NODE p;以下叙述正确的是(C)A)p是指向struct node结构变量的指针的指针B)NODE p;语句出错C)p是指向struct node结构变量的指针D)p是struct node结构变量6.若有以下定义和语句union data{ int i; char c; float f;}x;int y;则以下语句正确的是( )。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*函数功能:对变量a赋值,并返回a的值*/
int change(int a ) { a = 2; return a; }
指针变量作函数参数
【例1.b 】用指针编写程序修改一个变量的值。
#include <stdio.h> int main() { int a = 1; int * pa = &a; /* pa指向a*/ printf("initial a = %d,",a); *pa = 2; /* 即a=2 */ printf("now a = %d\n",a); return 0; }
11/51
指针变量作函数参数
【例1.a 】编写函数修改一个变量的值。
#include <stdio.h> int change(int a ); int main() { int a = 1; printf("initial a = %d,",a); a = change(a);/*调用函数change(),返回改变后的值*/ printf("now a = %d\n",a); return 0; }
#include <stdio.h> void change(int * p1,int * p2 ); int main() { int a = 1, b = 2; int * p1 = &a, * p2 = &b; printf("initial a = %d,b = %d,",a, b); change(p1,p2); printf("now a = %d,b = %d\n",a, b); return 0; } void change(int * p1, int * p2 ) { *p1 = 2; *p2 = 3; }
27/51
指针变量作函数参数
【练习】编函数实现三个数的降序输出。
#include <stdio.h> void exchange(int * , int * , int * ); void swap(int * , int * ); int main() { int a,b,c,*p1,*p2,*p3; printf("please enter three numbers:"); scanf("%d %d %d",&a,&b,&c); p1=&a; /*p1指向a*/ p2=&b; /*p2指向b*/ p3=&c; /*p3指向c*/ exchange(p1,p2,p3); /*调用函数exchange(),将p1,p2,p3指向的 变量进行降序排列*/ printf("The order is:%d,%d,%d\n",a,b,c); return 0; }
9/51
指针变量的定义和初始化
指针变量的初始化 未初始化的指针变量为随机值 野指针(悬挂指针) 可能会造成数据的误操作,引发严重后果 未确定初始值的指针变量的初始化 将其初始化为NULL
NULL表示空,零值(定义于stdio.h)
10/51
指针变量的使用
指针的使用原则 永远清楚每个指针指向了哪里,指针必须 指向一块有意义的内存 永远清楚每个指针指向的对象的内容是什 么 永远不要使用未经初始化的指针变量

指针的引出 内存中的地址按字 节编号,每个字节的 存储单元均对应一个 地址 char a = „A‟; int b = 0,c = 0; 指针就是地址!
4/51

地址
00236FF6F 00236FF70 00236FF71 00236FF72 00236FF73 00236FF74 00236FF75 00236FF76
24/51
指针变量作函数参数
/*函数功能:计算数组元素之和与平均值*/ int Sum(int a[],int n) { int i , sum = 0; for(i=0; i<n; i++) { sum += a[i]; } return sum; }
25/51
指针变量作函数参数
【例3.c】 编函数实现求n个整数的和与平均值。
指针变量作函数参数
【例2】编写函数实现两个数的交换。
#include <stdio.h> int main() { int a,b; a = 1; b = 2; printf(“initial a = %d,b = %d”,a,b); swap(a,b); printf(“now a = %d,b = %d”,a,b); return 0; }
/*函数功能:修改p所指向的变量的值*/
void change(int *p ) { *p = 2; }
指针变量作函数参数
传地址调用 将变量的地址传递给函数的形参 形参和实参指向了同一个内存地址,对 形参的操作同时影响了实参的值
&a
实参
a
pa
16/51
形参
指针变量作函数参数
【练习】编函数修改两个变量的值。
23/51
指针变量作函数参数
【例3.b】 编函数实现求n个整数的和与平均值。
#include<stdio.h> #define N 20 void ReadData(int a[], int ); int Sum(int a[], int ); int main(void) { int a[N], n, sum; float aver; printf("Input n:"); scanf("%d", &n); printf("Input %d numbers:", n); ReadData(a,n); sum = Sum(a, n); aver = (float)sum/n; printf("sum = %d and average = %.2f\n",sum,aver ); return 0; }
#include<stdio.h> #define N 20 void ReadData(int a[], int ); void Sum_Aver(int a[], int *, float *, int ); int main(void) { int a[N], sum, n; float aver; printf("Input n:"); scanf("%d", &n); printf("Input %d numbers:", n); ReadData(a,n); Sum_Aver(a, &sum, &aver , n); printf("sum = %d and average = %.2f\n",sum,aver ); return 0; }
19/51
void swap(int *a,int *b) { int temp;
指针变量作函数参数
要使某个(些)变量的值通过函数调用发生改变,或 者说让函数返回多个值:
(1) 在主调函数中,把该变量的地址作为实参
(2) 在被调函数中,用形参(指针)接受地址
(3) 在被调函数中,改变形参(指针)所指向变量 的值,即在被调函数中采用间接访问方式来改变所 指向变量的值(即主调函数中变量的值)2/51指针变量作函数参数
/*函数功能:将数组写入数据*/ void ReadData(int a[], int n ) { int i; for(i=0; i<n; i++) { scanf("%d", &a[i]); } }
指针变量作函数参数
/*函数功能:计算数组元素之和与平均值*/ void Sum_Aver(int a[],int n) { int i, sum = 0; float aver; for(i=0; i<n; i++) { sum += a[i]; } aver = (float) sum / n; printf("sum = %d and average = %.2f\n",sum,aver ); }
欲速则不达,见小利则大事不成
C语言程序设计
主讲教师:陈哲云
学习指针的重要性
指针是C语言的灵魂。 •提高程序效率(高效传递数组和结构) •实现内存的动态分配
•直接访问硬件
•在函数数据传递中,通过传址改变实参
•处理复杂的数据结构
指针
引例: 1.编函数实现修改一个数的值。 2.编函数实现两个数的交换。 3.编函数实现求n个整数的和与平均值。
指针变量作函数参数
【例3.a】 编函数实现求n个整数的和与平均值。
#include<stdio.h> #define N 20 void ReadData(int a[], int ); void Sum_Aver(int a[], int ); int main(void) { int a[N], n; printf("Input n:"); scanf("%d", &n); printf("Input %d numbers:", n); ReadData(a,n); Sum_Aver(a, n); return 0; }
变量值 …
A 0 0 0 0 0 0 0 0
变量名
a b
c

指针变量
指针变量的定义 指针变量 是一种特殊类型的变量 只能存放变量的地址 指针变量的定义方法 类型关键字 * 指针变量名; /*定义一个指向整型变量的指针*/ int * pa;
相关文档
最新文档