第十章 指针
C语言程序设计_谭浩强_第二版_CH10

}
第十章 指针 10.3 数组的指针和指向数组的指针变量 10.3.2 通过指针引用数组元素 例10.5输出数组中的全部元素。 ②通过数组名计算数组中元素的地址,找出元素的值。
main() {
int a[10],i; for(i=0;i<10;i++){scanf(“%d”,&a[i]);} print(“\n”); for(i=0;i<10;i++){printf(“%d”,*(a+i));} print(“\n”);
}
运行结果为: 100,10 100,10
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.1 通过指针变量访问整型变量
pointer_1 &a
a 100 *pointer_1
pointer_2 &b
b 10 *pointer_2
第十章 指针 10.2 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 5 *pointer_1
pointer_2 &b
b 9 *pointer_2
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
b 5 *pointer_2
&b
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 9 *pointer_1
第十章 C++ 基础

华厦职业学院
C语言程序设计
其中public是成员的属性说明,表示公有成员, 类的成员还可以声明为private(私有成员)或 protected(保护成员),不同属性的成员在访问时 规则不同。 类定义好之后,可以像结构那样定义变量,方 法是: 类的名称 变量名称;
华厦职业学院
C语言程序设计
在C++中类定义的变量称为对象(object),在定 义对象时,也可以用类名来定义类变量的指针,注 意在使用时类名称之前不写class。例如: time t; // t是类time的一个对象; time *pt; // pt是一个指向类对象的指针
华厦职业学院
C语言程序设计
关于成员函数,有以下规则: (1) 成员函数是类的函数,不能独立执行,必须要 用一个对象或对象指针来调用执行,什么对象调用 成员函数,成员函数就作用于什么对象,既成员函 数的执行结果依赖于具体的对象; (2) 成员函数中可以存取同一个类中的成员变量, 这些成员变量就是相应对象的成员变量;成员函数 也可以调用同一个类中的其它成员函计
10.3
构造函数与析构函数
10.3.1 构造函数 用类来定义对象变量时,往往需要让对象有一个初始值, 完成这种功能的函数就是构造函数。构造函数是与类同名的 函数,但函数没有任何返回类型,也不是void类型,例如: class time { public: int h,m,s; time() { h=0; m=0; s=0; } void set(int th,int tm,int ts) { h=th; m=tm; s=ts; } void show(); };
华厦职业学院
C语言程序设计
10.1 类与对象 10.2 this指针 10.3 构造函数与析构函数 10.4 引用与复制构造函数 10.5 动态内存分配 10.6 类成员的访问规则 10.7 对象的赋值 10.8 运算符重载
c语言 ●第10章 指针-1

…
19
2.定义时同时赋值
int a[10];
int *p=a; c规定: /* 相当于int *p=&a[0] */
若有 int a[10];
int *p=a; 则 p+1:指向下一个数组元素。
…
p+i:其指向下移i个元素。
20
说明:若有 int a[10]; int *p=a; (1) p+i *(p+i) = &a[i] a[i]= a+i *(a+i) (2)数组的指针变量也可带下标 a[i] ,p[i], *(a+i),*(p+i) 是等价的。 (3)a与p的区别:a代表数组a的首地址,是常量。 p=a; p也代表数组a的首地址,是变量。 如:p++; 是正确的,而 a++; 是错误的。 (4)引用数组元素有三种方法: 下标法: a[i]或p[i] 地址法:*(a+i) 效率低 指针法:*(p+i) *p++ 效率高
13
讨论: 若将被调函数swap( )改为: swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; /*中间变量是指针变量所指的对象*/ } p无确定的地址(地址是随机的),可能指向任何单 元,有可能破坏系统(乱放枪)。加上int c;p=&c;就没 有问题了。
3 6 9 …
i j k
2004
3010
2000
i_pointer
3
二.对内存单位的访问 存数—写 取数—读 对内存单位的访问,是通过地址进行的。 如: printf(“%d”,i); 读 再如:scanf(“%d”,&i); 写 直接访问:按变量的地址直接读写变量的值。 如:k=i+j; (1)从2000开始的内存单元中取出i的值3. (2)从2002开始的内存单元中取出j的值6. (3)相加后,送入2004开始的内存单元。 间接访问:将变量a的地址存入另一变量b中,访问a时,先 找b,取出a的地址,再按此地址访问a。
《C语言程序设计》课程教学大纲

《C语言程序设计》课程教学大纲一、课程教学目的本课程系统研究C语言的基本知识和基本语法,较好地训练学生解决问题的逻辑思维能力以及编程思路和技巧,使学生具有较强的利用C语言编写软件的能力,为培养学生有较强软件开发能力打下良好基础。
二、课程教学要求通过本课程的研究,应熟练掌握C语言中的基本知识、各种语句及程序控制结构,熟练掌握C语言的函数、数组、指针、结构体、链表等数据结构的基本算法;并能熟练地运用C语言进行结构化程序设计;具有较强的程序修改调试能力;具备较强的逻辑思维能力和独立思考能力。
三、课时分配本学科计划学时为246学时,其中理论与实训课时比例为7:3.四、课程教学重、难点课程教学重点:掌握C语言变量类型及不同类型常量的表示;标准的输入输出函数的使用;运算符及常用数学函数的使用;控制流程、数组和指针的使用;结构体、链表的构造使用;函数结构、函数参数传递及递归等方面的知识;基本的文件操作。
难点:指针的使用、结构体链表的构造和使用及函数的参数传递。
五、课程教学方法(或手段)本课程实践性较强,故采用讲授和上机操作相结合的方式进行教学。
六、课程教学内容第一章C言语概述1.教学内容(1)编程历史的回顾、程序设计介绍(过程式,面向对象,函数式,逻辑式);(2) C语言的历史背景、特点;(3) C言语源步伐的格式和步伐结构;(4) C程序的上机步骤。
2.重、难点提醒(1)重点:掌握简单的C程序格式,包括main()函数、数据说明、函数开始和结束标志等;(2)难点:编程入门和对言语的理解。
第二章算法1.教学内容(1)算法的概念及特征;评价算法优劣的方法(时间和空间);(2)简单算法举例;(3)算法的表示(自然语言、流程图、N-S流程图);(4)结构化步伐设计的基本思想及基本步调。
2.重、难点提醒(1)重点:算法流程图三种基本结构(以后各章研究中使用流程图强化对步伐的理解);(2)难点:算法概念和对结构化步伐设计思想的理解。
Fortran指针

二、插入和删除
插入:
删除:
不过编写interface很麻烦,将函数封装在module中,就等于 编写好interface
10.4
指针的应用
在两条数据进行交换,尤其是这两条数据量很大的时 候,这时用指针可以提高执行效率,而且需要的空间 小 一· 指针还可以创建各种串行结构,以及树状结构 串行结构:
1:单向串行
双向串行:
环状串行:
第十章 指针
实质:给一个变量起一个别名
10.1 指针的基本概念 指针变量的定义格式
类型说明, POINTER::指针变量名1, 指针变量名2, …
类型说明,它表示该指针所指的目标变量类型。
指针的使用: 格式:指针变量=>目标变量或者另一指针变量。
注意:指针变量与目标变量的类型应当一致
10.2 指针数组
指针也可以声明成数组来进行使用
这里有两个使用方法: 1:让指针指到其他数组 2:配置一个内存空间来使用
第一种情况: Example: Integer , pointer :: a(:) Integer , target :: b(5)=(∕1,2,3,4,5∕) a=>b ! a(1~5)=>b(1~5)
第二种情况: 动态分配存储单元函数:ALLOCATE
方法:先定义指针,再利用ALLOCATE(P)函数为其动 态分配空间,其中P为指针变量。
优点:通过动态定义,可以根据当时使用 空间大小来生成空间,使数组大小满足 要求。
注意: 释放存储单元函数:DEALLOCATE
10.3 指针与函数
指针变量可以作为参数在函数之间传递,也可 以作为函数的返回值 使用时需要注意以下几点策略: 1:要把指针传递给函数时,要声明这个函数的参数 使用接口interface. 2 指针参数声明时不需要intent这个形容词。 3函数返回值若为指针时,需要定义函数的interface.
第十章实验十三 把电流表改装为电压表

第十章
恒定电流
2.改装 (1)算出电流表的满偏电压Ug; (2)如果把电流表改装成量程为U的电 压表,计算应串联的电阻阻值R3; (3)将电阻箱阻值调为R3,把电流表与 电阻箱串联起来.
第十章
恒定电流
3.(1)按如图10-5-2所示连接电路, 并使变阻器R的滑片在分压值最小的位 置,使输出电 压起始为零.
________,使________,记下此时RN
的读数;
(3)多次重复上述过程,计算RN读数的
________,此即为待测微安表头内阻
的测量值.
第十章
恒定电流
【解析】
本题方法为替代法.
当S接1与接2时通过电路的电流I相同, 可知待测μA的内阻与RN的电阻相同. 【答案】 (2)RN (1)R0 标准电流表(或A0)
图10-5-2
第十章
恒定电流
(2)改变变阻器R的滑片位置,使标准 电压表V的示数分别为0.5 V、1.0 V、 1.5 V、2.0 V…,直至使电流表达到 满偏(注意电压表的量程),并核对改 装的电压表的示数是否正确.
第十章
恒定电流
(3)算出改装的电压表满刻度时的百分误 |U-U0| 差( U ×100%,其中 U 为标准电压 表的满偏电压,U0 为改装后的电压表的 满偏电压).
第十章
恒定电流
实验创新 在用“半偏法”测电流表内阻时,由于 存在系统误差,使得测量值偏小.我 们可以在原电路的基础上在干路中串 接一标电路,实验时反复调节 滑动变阻器 R 和电阻箱 R′,使标准电流 表 A0 的读数始终为待测电流表的满偏电流 Im Im,待测电流表的示数为 , 2 此法系统误差便得到消除, 即电流表的内阻为 rg=R′.
第十章
c语言第10章指针

3.间接引用指针
间接引用指针时,可获得由该指针变量所指向的变量内容。
例如,int i=10,*ip=&i;
ip
i
cout<<*ip<<endl;
0000:F384 0000:F384 210
运行结果为:10 即指针ip所指向的变量i的内容。
*放在定义过的指针变量之前,称为间接引用操作符; *放在指针变量定义中时,称为指针定义符。 非指针变量不能用间接引用操作符,*只能作用于地址。
例如, double d=1.23,*dp; char c,*cp;
在&和cp*=作&d用; 下,对变量d和dp有如下6种操作: 其d,中d,dpp,=*&d*是cd; ,非*法dp的,;&&d指,dp针&是只d指p能。针指的向地与址其即同二类级型指的针量。 另外,指针除了可指向所有基本类型的变量外,指针也可 指向常量、数组、数组元素、函数、指针以及文件等。
int ii=n1t0;b, a[10]; int *inpt=&*pi;1,//*初p2始; 化为整型变量的地址,但 *ip=p&1=i;&//是b;错误的
注意:p2不=p要1将; “//可in以t *将ip=一&个i;”已与赋“值*i的p=指&i针;”混赋淆给。另一个相同类型的指针 前者是p2定=&义a语[5句];,*是指针定义符,系统为指针变量ip分配一个空间, 并2、用i数的地组址的值地初址始值化;可后用者该是数执组行语的句数,组左名右表两边示类。型例不如匹:配。 指 例3、针如变,ip函n=d*d量t数bodob;up在u的b=b[3使ll6ee].地8[用*d;4d=址]前/p2,/!(;.,*5值;p一)由[定4该]要; 函被数$赋$$以的d$:p一$名$个$字$地来址表值$$$,示$:否$。$$则$例是如很#6某#:危.#8变险量的。 没有被do赋ub值le的s指in针(d变ou量bdlep的x值);是一个随机地址,把6.8赋给内存中的 随机位do置ub,le很(可*p能f)破( 坏); 了另一个变量,甚至修改了栈中的函数返回 地址,pf造=s成in计; 算机死机或进入死循环。
第十章 指针(含答案)

第十章指针一、选择题1.以下程序的运行结果是【C】。
sub(int x,int y,int *z){*z=y-x ;}main(){ int a, b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4d\n”,a,b,c);}A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-72.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】A)s+1 B)s++ C)&s[0]+1 D)&s[1]3.下列程序能对两个整型变量的值进行交换。
以下正确的说法是【 D】。
main(){ int a=10,b=20;printf("(1)a=%d,b=%d\n",a,b);swap(&a,&b);printf(“(2)a=%d,b=%d\n”a,b);}swap(int p, int q){ int t; t=p;p=q;q=t;}A. 该程序完全正确B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可D. 以上说法都不正确4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。
(1)int *p,*q; q=p;int a,*p,*q;p=q=&a;(2)int a,*p,*q; q=&a; p=*q;int a=20, *p; *p=a;(3)int a=b=0,* p; p=&a; b=* p;int a=20,*p,*q=&a; *p=*q;(4)int a=20,*p,*q=&a; p=q;int p, *q; q=&p;A.正确:(1);不正确:(2),(3),(4)B.正确:(l),(4);不正确:(2),(3)C.正确:(3);不正确:(1),(2),(4)D.以上结论都不正确5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。
指针

The C Programming Language
Chapter 10 Pointers
10.2 变量的指针和指向变量的指针变量
• 指针:一个变量的地址 • 指针变量:专门存放变量地址的变量叫指针变量
指针 2000 …... 整型变量i
变量的地址
2001 2002 2003 2004 2005
10
main() { int *p1,*p2,*p,a,b; 2000 scanf("%d,%d",&a,&b); 2002 p1=&a; p2=&b; 2004 if(a<b) 2006 { p=p1; p1=p2; p2=p;} 2008 printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); }
– 指针变量的定义
• 一般形式: [存储类型] 基类型 *指针名; 例 int *p1,*p2; float *q ; 表示定义指针变量,起类型说明的作用 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 static char *name; 不是‘*’运算符 注意: 1、int *p1, *p2; 与 int *p1, p2;的区别 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
整型变量i 整型变量k
10
10
变量i_pointer 指针变量
The C Programming Language
Chapter 10 Pointers
指针变量与其所指向的变量之间的关系
(完整版)《C语言程序设计》课程教学大纲

《C语言程序设计》课程教学大纲一、课程教学目的本课程系统学习 C语言的基本知识和基本语法,较好地训练学生解决问题的逻辑思维能力以及编程思路和技巧,使学生具有较强的利用 C 语言编写软件的能力,为培养学生有较强软件开发能力打下良好基础。
二、课程教学要求通过本课程的学习,应熟练掌握 C 语言中的基本知识、各种语句及程序控制结构,熟练掌握 C 语言的函数、数组、指针、结构体、链表等数据结构的基本算法;并能熟练地运用 C 语言进行结构化程序设计;具有较强的程序修改调试能力;具备较强的逻辑思维能力和独立思考能力。
三、课时分配本学科计划学时为246学时,其中理论与实训课时比例为7:3。
四、课程教学重、难点课程教学重点:掌握C语言变量类型及不同类型常量的表示;标准的输入输出函数的使用;运算符及常用数学函数的使用;控制流程、数组和指针的使用;结构体、链表的构造使用;函数结构、函数参数传递及递归等方面的知识;基本的文件操作。
难点:指针的使用、结构体链表的构造和使用及函数的参数传递。
五、课程教学方法(或手段)本课程实践性较强,故采用讲授和上机操作相结合的方式进行教学。
六、课程教学内容第一章 C语言概述1.教学内容(1) 编程历史的回顾、程序设计介绍(过程式,面向对象,函数式,逻辑式);(2) C语言的历史背景、特点;(3) C语言源程序的格式和程序结构;(4) C程序的上机步骤。
2.重、难点提示(1)重点:掌握简单的 C程序格式,包括main()函数、数据说明、函数开始和结束标志等;(2)难点:编程入门以及对语言的理解。
第二章算法1.教学内容(1) 算法的概念及特性;评价算法优劣的方法(时间和空间);(2) 简单算法举例;(3) 算法的表示(自然语言、流程图、N-S流程图);(4) 结构化程序设计的基本思想及基本步骤。
2.重、难点提示(1)重点:算法流程图三种基本结构(以后各章学习中利用流程图强化对程序的理解);(2)难点:算法概念以及对结构化程序设计思想的理解。
指针

(main)
9 5 5 9 2000 2002
(swap)
2000 2002 5
...
…...
整型变量a 整型变量b 指针pointer_1 指针pointer_2
指针p1 指针p2
整型p
例 将数从大到小输出
swap(int *p1, int *p2) { int p; 2000 p=*p1; 2002 *p1=*p2; 2004 *p2=p; 2006 } 地址传递 2008 main() 200A { int a,b; int *pointer_1,*pointer_2; 200C scanf("%d,%d",&a,&b); 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
#define NULL 0 int *p=NULL:
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较
例 例 char *p; int *p1; ...... void *p2; while(p!=NULL) p1=(char *)p2; { ...… p2=(void *)p1; } 表示不指定p是指向哪一种 类型数据的指针变量
…...
例
整型变量i
i=3;-----直接访问
2000 2001 2002 2003 2004 3 20 10
变量i_pointer 2000
2005
2006
指针变量
例
*i_pointer=20; -----间接访问
《C语言程序设计》课程教学大纲

《C语言程序设计》课程教学大纲适用专业信息与计算科学总学时90学分 4一、编写说明(一)本课程的性质、地位和作用本课程属于信息与计算科学的专业课,C程序设计语言的语法规则、数据类型、数据运算、语句、函数、指针、程序结构等方面的学习,掌握应用C语言进行程序设计的技能,为今后进一步学习程序开发以及科学与工程计算的软件开发奠定一个良好的基础。
(二)本大纲制定的依据根据本专业人才的培养目标和人才培养规格所需要的基本理论和基本技能的要求,根据本课程的教学性质、条件和教学实践而制定。
(三)大纲内容选编原则与要求通过对本课程的学习,使学生掌握基本概念、基本原理、基本知识和实际操作能力,重点落实到“用”上。
在对大纲内容选编时,在注重基本原理、基本概念的同时,特别强调实用系统的设计与开发,做到了理论与实践有效结合。
(四)实践环节实验1:C程序的运行环境和运行一个C程序的方法, 2学时主要内容与要求:了解所用的计算机系统的基本操作方法,学会独立使用该系统;了解在该系统上如何编辑、编译、连接和运行一个C程序;通过运行简单的C程序,初步了解C 程序的特点。
实验2:简单的C程序设计,2学时主要内容与要求:掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法;掌握不同类型数值之间赋值的规律;学会使用C的有关算术运算符,以及包含这些运算符的表达式;掌握赋值语句的使用方法;掌握各种类型数据的输入输出方法,能正确使用各种格式转换符。
实验3:逻辑结构、循环控制程序设计,4学时主要内容与要求:了解C语言表示逻辑量的方法;学会正确的使用逻辑运算符和逻辑表达式;熟练掌握if语句和switch语句;熟悉掌握用while 语句,do while语句和for语句实现循环的方法;掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等);进一步学习调试程序。
实验4:数组、函数,4学时主要内容与要求:掌握一维数组和二维数组的定义、赋值和输入输出方法;掌握字符数组和字符串函数的使用;掌握与数组有关的算法(特别是排序算法);掌握定义函数的方法;掌握函数实参与形参的对应关系以及“值传递”的方式;掌握函数的嵌套调用和递归调用的方法;掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法;学习对多文件程序的编译和运行。
高中物理大一轮复习第十章实验十三把电流表改装成电压表讲义课件大纲人教.ppt

五、实验步骤
1.测定电流表的内阻 Rg,按上图接 好电路,先合 S1,调整 R 的阻值 使电流表指针恰好指到满刻度;
再合上 S2,调整 R′的阻值(R 的
图2
阻值不变),使电流表指针正好指
满刻度的一半,在满足 R≥100R′时,Rg=R′. 2.把电流表改装成量程是 2 V 的电压表.根据测出的 Rg 和
解析 (1)实验电路如图所示 (2)当S1与S2闭合时: R1+E RV·RV=U1 当S1闭合、S2断开时: R1+RE2+RV·RV=U2 由以上两式得R1=6 000 Ω,E=6.3 V 改装后的电压表量程为Ug′=RUVg(R1+RV)=7 V
答案 (1)见解析图 (2)7 6.3
随堂巩固训练
电流表、电位器、电阻箱、开关、电池组、滑动变阻
器、标准电压表、导线若干.
四、实验器材的选择 根据半偏法测表头内阻的原理,滑动变阻器的电阻R应 远大于电阻箱的电阻R′,而R′=rg,由于一般电流 表的内阻约几百欧~几千欧,所以电阻箱可选用最大 电阻为10 kΩ的高精度电阻箱,滑动变阻器则应选最大 值为几百千欧的滑动变 阻器.又因为滑动变阻器两端的电压远大于电流表的 满偏电压Ug,所以选用的电源的电动势E也应远大于 Ug.
从电流表说明书中查出的满偏电流 Ig,计算串联分压电 阻 Rx; Rx=U/Ig-Rg=2/Ig-Rg
3.在电阻箱上取阻值Rx,再使之跟 电流表串联起来,就改装为量程
为2 V的电压表了,如图2所示.
4.把改装成的电压表跟标准电压表
校对.按图3接好电路,闭合S,
改变R0的触点,使标准电压表指 示不同的读数,看改装的电压表
答案 D
5.已知某电流表的满偏电流为10 mA,内阻为8 Ω.现要将 此电流表与一电阻箱R连接后改装成一个量程为0~6.0 V 的电压表,并将组成的电压表与一个电源E、电阻R0、 开关S构成回路,用它测量R0两端的电压. (1)试在实物图10中画出连线完成电路连接;
第十章 指针指针是C语言中广泛使用的一种数据类型. 运用指针.

int *p; p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是 错误的。
3、指针变量的引用
欲穷千里,更上层楼
两个指针运算符: (1)取地址运算符:& (2)取内容运算符:*
例如: &a为变量a的地址,*p为指针变量p所指向的变 量
#include ”stdio.h”
#include “conio.h”
表示对数组元素a[2]赋以值1
C规定p+1指向下一个元素(实际含义为p+1*d,d为一个数组元素 所占字节数)
如果p的初值为&a[0],则:
p+i和a+i就是a[i]的地址,或者说它们指向a数组的第i元素
*(p+i) 或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
p a数组
a[0]
p+1,a+1
a[1]
p+i,a+i
*(p+i)
a[i]
p+9,a+9
a[9]
欲穷千里,更上层楼
p,a,&a[0]均指向同一单 元,它们是数组a的首地 址,也是第0 元素a[0]的 地址。
p+1,a+1,&a[1]均指向 第1元素a[1]。类推可知 p+i,a+i,&a[i]指向第i元素 a[i]。
应该说明的p是变量, 而a,&a[i]都是常量。在 编程时应予以注意。
2)在讲述一维数组时候我们曾经提到: 因为: a[i]和*(a+i) 等价! 所以: a[i]+j= =*(a+i)+j= =&a[i][j]
Fortran指针

实质:给一个变量起一个别名
10.1 指针的定义与使用 一、 指针变量的定义格式
类型说明, POINTER::指针变量名1, 指针变量名2, …
类型说明,它表示该指针所指的目标变量类型。 POINTER为指针定义的关键字。
指针变量与目标变量的类型应当严格一致
例如: INTEGER,POINTER :: A1, A2 可以将类型说明与指针说明分开,例如: INTEGER A1,A2 POINTER A1,A2
PRINT*,"S1=", S1 PRINT*,"S2=", S2 PRINT*,"S3=", S3 PRINT*,"S4=", S4 PRINT*,"S5=", S5 END 输入:3 4 输出:X=12
S1=12 S2=12 S3=12 S4=12 S5=12
10.2 动态变量
动态分配存储单元函数:ALLOCATE 释放存储单元函数:DEALLOCATE
一、指针数组的定义
格式: 类型说明,DIMENSION(: … :),POINTER::指针名
DIMENSION(: … :): 数组的动态说明标识,不指定数组下标界限
“:” 个数=数组维数 POINTER:指针说明标识。
例: REAL, DIMENSION(:), POINTER :: X
!声明指向一维实型数组的指针X
方法:先定义指针,再利用ALLOCATE(P)函数为其 动态分配空间,其中P为指针变量。
P195 例10.4 ALLOCATE和DEALLOCATE函数的用 法:
PROGRAM POINTER4 INTEGER,POINTER::P1,P2 !定义指针变量P1、P2
c语言基础教程-第十章------文件和读写函数

C语言基础教程文件和文件指针1.文件一般说来,文件是有序数据的集合。
程序文件是程序代码的有序集合,数据文件是一组数据的有序集合。
文件是被存放在外部存储设备中的信息。
对文件的处理过程就是面向文件的输入和输出过程。
文件的输入过程是从文件中读出信息,文件的输出过程是往文件中写入信息,文件的输入的过程使用读函数,实现文件输出的过程使用写函数。
文件的读写函数是实现文件操作的主要函数,本章将用大量篇幅来讲述文件的读写函数。
C语言文件被称为流式文件,其特点是不分记录或块,将文件看成是信息"流"或看成是一个字符流(文本文件),或看成是一个二进制流(二进制文件).文件的存取是以字符(字节)为单位的,读写数据流的开始和结束受程序控制。
任何一个文件都是以EOF结束,最简单的文件是只有结束符的空文件。
C语言文件包含有设备文件和磁盘文件,例如,键盘是一种输入信息的文件,显示器屏幕和打印机是输出信息的文件它们都属于设备文件。
将内存的信息放到磁盘上保存,需要时再从磁盘上装入内存,这就要使用磁盘文件,磁盘文件是计算机中常用的文件nC语言文件按存放设备分设备文件和磁盘文件;按数据的组织形式分为文本文件(ASCII码文件)和二进制文件。
文本文件是按一个字节存放一个字符的ASCII码来存放的;二进制文件是按数据在内存中的存储形式放到磁盘上的。
例如,有一个整数10000,在内存中按二进制形式存放,占2个字节,将它放在磁盘上如按文本文件形式存放,占5个字节,每个数位占一个字节。
两种存放方式各有利弊。
以文本文件形式输出便于对字符进行处理,也便于输出字符,但是占用存储空间较多,并且要花费转换时间。
以二进制文件形式输出可节省存储空间和转换时间,但是不能直接输出字符形式。
2.文件指针文件指针是一种用来指向某个文件的指针。
如果说某个文件指针指向某个文件,则是该文件指针指向某个文件存放在内存中的缓冲区的首地址。
每一个被使用的文件都要在内存中开辟一个区域,用来存放的有关信息,包括文件名字、文件状态和文件当前位置等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19
10.4 字符串与指针
字符串的表示形式
1. 可以用字符数组表示字符串
main() { char string[]=”I love China!”; printf(“%s\n”, string); }
2. 可用字符指针变量来表示
main() { char *string=”I love China!”; printf(“%s\n”, string); }
9
10.2.2 指针变量的引用
& :取地址运算符 * :指针运算符
i_pointer-----指针变量,它的内容是地址量 Eg10.1 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 main() &*i_pointer等价于i_pointer { (&*i_pointer)++与&*i_pointer++的区别 int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1,*pointer_2); }
21
10.5 指向函数的指针
赋值 函数名代表该函数的入口地址。因此,可用 函数名给指向函数的指针变量赋值。 指向函数的指针变量=[&]函数名;
注意:函数名后不能带括号和参数;函数名前的 “&”符号是可选的。
调用格式 (*函数指针变量)([实参表])
22
用指向函数的指针作函数参数
eg24
23
10.6返回指针值的函数
10
指针应用举例
例:输入两个数按由大到小输出. #include <stdio.h> main() p1 { int *p1,*p2,*p,a,b; &a p scanf("%d,%d",&a,&b); p1=&a;p2=&b; p1=&a;p2=&b; p2 scanf("%d,%d",p1,p2); if(a<b) &b { p=p1;p1=p2;p2=p; } printf("\na= %d,b=%d\n\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); } a 8 b 10
第10章 指 针
C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值
1
10.1 地址和指针的概念
内存中每个字 节有一个编号
——地址
2000 2002 2004 3010
内存
0 …… 3 6 9 …… 2000 …
程序中: int i,j,k;
6
变量* i_pointer
指针变量 i_pointer
10.2.1 定义一个指针变量
基类型 *指针变量名;
7
10.2.1 定义一个指针变量
基类型 *指针变量名;
例如:
int i,j; int *pointer_1,*pointer_2 float *pointer_3; char *pointer_4;
变量i_pointer 2000
2005
2006
指针变量
例
*i_pointer=20;
-----间接访问
…...
或者 scanf(“%d”,i_pointer);
5
10.2 指针与指针变量
指针:变量的地址 指针变量:专门存放变量地址的变量
内存
0 2000 2002 2004 3010 …… 3 6 9 …… 2000 …
3
(1)直接访问──直接利用变量的地址进行存取 scanf(“%d”,&num)的执行过程是这样的: 用变量名num作为索引值,检索符号表 ,找到变量 num的起始地址3000; 然后将键盘输入的值(假设为3)送到内存单元3000 和3001中。 printf("num=%d\n",num)的执行过程,与scanf()很相似: 找到变量num的起始地址3000, 从3000和3001中取出其值,最后将它输出。 (2)间接访问──通过另一变量访问该变量的值
pointer_1=&i; pointer_2=&j;
*pointer_1 *pointer_2 i j
8
注意:
1) 在定义指针变量时,变量名前的*表示该变量的 类型为指针变量.指针变量的命名规则与基本 变量的命名规则相同.
2) 在定义指针变量时必须指定其基类型. 3) 指针变量只能存放与它定义时的基类型相同 的变量的地址.
编译或函数调用时 为其分配内存单元
变量是对程序中数
据 存储空间的抽象
2
变量地址──系统分配给变量的内存单元的起始地址 例如: main() { int num; scanf("%d",&num); printf("num=%d\n", num); }
C编译程序编译到该变量定义语句时,将变量num 登录到 “符号表”中。符号表的关键属性有两个: •一是“标识符名(id)” , •二是该标识符在内存空间中的“地址(addr)” 。 为描述方便,假设系统分配给变量num的2字节存储单元 为 3000 和3001,则起始地址3000就是变量num在内存中 的地址。 变量值的存取──通过变量在内存中的地址进行 系统执行scanf(“%d”,&num);和printf(“num=%d\n”, num); 时,存取变量num值的方式可以有两种:
20
10.5 指向函数的指针
用函数指针调用函数
一个函数在编译时,被分配了一个入口地址,这个 地址就称为该函数的指针。 可以用一个指针变量指向一个函数,然后通过该指 针变量调用此函数。
指向函数的指针变量 定义格式 函数类型 (*指针变量)( );
注意:“*指针变量”外的括号不能缺, 否则成了返回指针值的函数。
swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; }
12
10.3 数组与指针
指向数组元素的指针
和指向变量的指针一样
例 int array[10]; int *p; p=&array[0]; // p=array; 或 int *p=&array[0]; 或 int *p=array; 数组名是表示数组首地址的地址常量
11
10.2.3 指针变量作为函数参数
——地址传递
main() { 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); printf("\n%d,%d\n",a,b); } Eg10.3
13
10.3 数组与指针
输出数组中的全部元素(eg10.5)
下标法 数组名计算地址法 指针变量法
14
数组名计算数组元素地址法
main() { int a[10]; int i; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(i=0;i<10;i++) printf("%d ",*(a+i)); }
10.3.4 多维数组与指针
多维数组的地址
int array[3][4]; 从2维数组角度看,数组名array代表数组的起始 地址, 是一个以行为单位进行控制的行指针:
array+i:行指针值,指向2维数组的第i行。 *(array+i):(列)指针值,指向第i行第0列(控 制由行转为列,但仍为指针)。 *(*(array+i)):数组元素array[i][0]的值。 用array作指针访问数组元素array[i][j]的格式: *(*(array+i)+j)
函数的返回值可以是整型、字符、实型值, 当然也可以是指针型的值 即返回的是某个内存数据的地址 函数定义 指针类型名 * 函数名(参数列表) eg25
24
25
15
指针变量指向数组元素法
main() { int a[10]; int *p,i; for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(p=a;p<(a+10);p++) printf("%d ",*p); }
16
指针变量的运算
如果p指向数组a的首元素(p=a):
C语言规定:在程序中可以定义一种特殊的变量(称为指针变 量),用来存放其它变量的地址。
4
直接访问与间接访问
直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量
…...
例
整型变量i
i=3;
-----直接访问
2000 2001 2002 2003 2004 3 20 10
或者Scanf(“%d”,&i);
P++ *p++ *(p++)和*(++P)的区别 (*p)++