第十章 指针

合集下载

C语言程序设计_谭浩强_第二版_CH10

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++ 基础

华厦职业学院
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 运算符重载

第十章 指针

第十章 指针

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
用指向函数的指针作函数参数

c语言 ●第10章 指针-1

c语言 ●第10章 指针-1
a[1] a[2]

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语言的函数、数组、指针、结构体、链表等数据结构的基本算法;并能熟练地运用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指针

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章指针

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十章指针一、选择题1.变量的指针,其含义是指该变量的_______________。

A) 值B) 地址C) 名D)一个标志2.已有定义int k=2; int *ptr1, *ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值是________________。

A)k=*ptr1+*ptr2 B) ptr2=k C) ptr1=ptr2D)k=*ptr1*(*ptr2)3.若有定义int *p, m=5,n;以下程序段正确的是________________。

A) p=&n; B) p=&n;scanf("%d",&p); scanf("%d",*p);C) scanf("%d",&n); D) p=&n;*p=n; *p=m;4.若有定义:int *p1, *p2, m=5, n;以下____________是正确的赋值语句。

A) p1=&m; p2=&p1; B)*p1=*p2; C) p1=&m; p2=p1; D) p1=&m; *p2=*p1; 5.若有int *p, a=4;和p=&a;下面____________均代表地址。

A) a, p, *&a B)&*a, &a, *p C) *&p, *p, &a D)&a, &*p, p6.若变量已正确定义并且指针p已经指向变量x,则*&x相当于____________。

A) x B) p C) &x D) &*p7.若定义了int m, n=0, *p1=&m;则下列____________表达式与m=n等价。

A) m=*p1 B)*p1=&*n C) *&p1=&*n D) *p1=*&n;8. 假如指针p已经指向整型变量x,则(*p)++相当于____________。

A) x++ B) p++ C) *(p++) D) &x++9. 对于基类型相同的两个指针变量之间,不能进行的运算是____________。

A) < B) = C) + D) -10. 若程序中已包含头文件stdio.h,以下选项中正确运用指针变量的程序段是__________。

A) int *i=NULL; B) float *f=NULLscanf("%d",i); *f=10.5;C) char t='m',*c=&t; D) long *L;*c=&t; L='\0';11. 有如下函数和变量定义int a=25; 执行语句print_value(&a);后的输出结果是___________。

void print_value(int *x){ printf("%d",++*x); }A) 23 B) 24 C) 25 D) 2612. 若有定义:char s[10]; 则在下面表达式中不表示s[1]的地址的是___________。

A) s+1 B) s++ C) &s[0]+1 D) &s[1]13.若有定义:int a[5], *p=a; 则对a数组元素的正确引用是_____________。

A)*&a[5]B)a+2 C)*(p+5) D)*(a+2)14. 若有定义:int a[5], *p=a; 则对a数组元素地址的正确引用是_____________。

A)p+5B)*a+1 C)&a+1 D)&a[0]15. 若有定义:int a[5]; 则a数组中首元素的地址可以表示为_____________。

A)&a B)a+1 C)a D)&a[1]16. 若要对a进行合法的自减运算,则之前应有下面___________的说明。

A) int p[3]; B) int k; C) char *a[3]; D) int b[10];int *a=p; int *a=&k; int *a=b+1;17. 以下选项中,________________对指针变量p的操作是正确的。

A) int a[3], *p; B) int a[5], *p;p=&a; p=a;C) int a[5]; D) int a[5], *p1, *p2=a;int *p=a=100; *p2=*p1;18若有定义int x[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p1;则数值不为3的表达式是___________。

A)x[3] B)p1=x+3,*p1++ c) p1=x+2,*(p1++) D) p1=x+2, *++p119. 设int x[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p=x, k; 且0≤k≤10,则对数组元素x[k]的错误引用是___________。

A)p+k B)*(x+k) c) x[p-x+k] D) *(&x[k])20. 若有定义int a[3]={ 1, 2, 3}, *p;则下列赋值语句中正确的是___________。

A) p=&a; B) *p=a; C) *(a+1)=a; D) p=a+1;21. 设int b[]={1, 2, 3, 4}, y, *p=b;执行语句y=*p++;后变量y的值为___________。

A) 1B) 2C) 3D) 422. 下面程序段执行后的输出结果是_____。

#include <stdio.h>void main(){int a[]={2, 4, 6, 8, 10}, y=0, x, *p=&a[1];for(x=1; x<3; x++) y+=p[x];pritnf("%d",y);}A) 10B) 11 C) 14 D) 1523.若有定义int a[2][3];则对a数组的第i行第j列元素地址的正确引用是_____。

A) *(a[i]+j) B) (a+i) C) *(a+j) D) a[i]+j24. 若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j均在有效范围内)地址的表达式是_____。

A) &a[0][0]+6*i+j B) &a[0][0]+4*j+i C) &a[0][0]+4*i+j D) &a[0][0]+6*j+i25. 若有定义int a[3][4];则与元素a[0][0]不等价的表达式是_____。

A) *a B) **a C)*a[0] D) *(*(a+0)+0)26. 若有定义int a=3, b, *p=&a; 则下列语句中___________使b不为3。

A) b=*&a; B) b=*p; C) b=a; D) b=*a;27. 若有定义int t[3][2];则能正确表示t数组元素地址的表达式是_____。

A)&t[3][2]B)t[1][1] C)t[2] D)t[3]28. 若有定义int a[4][5];下列_____引用是错误的。

A) *a B) *(*(a+2)+3) C) &a[2][3] D) ++a29. 若有定义int s[4][5], (*ps)[5]=s;;则对s数组元素的正确引用是_____。

A) ps+1 B) *(ps+3) C) ps[0][2] D) *(ps+1)+330. 若有定义int c[4][5]; (*p)[5]=c;;则能正确引用c数组元素的是_____。

A) p+1 B) p[3] C) p[1]+3 D) *(p[0]+2)31.下面程序执行后的输出结果是___________。

#include <stdio.h>void main(){int a[][4]={1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};int (*p)[4], i=2, j=1;p=a;printf("%d",*(*(p+i)+j));}A) 9 B) 11 C) 17 D) 1932.若有程序段int a[2][3], (*p)[3]; p=a;则对a数组元素地址的正确引用是___________。

A) *(p+2) B) p[2] C) p[1]+1 D) (p+1)+233. 若有程序段int a[2][3], (*p)[3]; p=a;则对a数组元素的正确引用是___________。

A) (p+1)[0] B) *(*(p+2)+1) C) *(p[i]+1) D) p[1]+234.下面程序执行后的输出结果是___________。

#include <stdio.h>void main(){int a[3][3], *p, i;p=&a[0][0];for(i=0; i<9; i++) p[i]=i+1;printf("%d",a[1][2]);}A) 3 B) 6 C) 9 D) 随机值35.若有定义int (*p)[4]; 则标识符p___________。

A) 是一个指向整型变量的指针B) 是一个指针数组名C) 是一个指针,它指向一个含有四个整型元素的一维数组D) 定义不合法36.以下正确的定义和赋值语句是___________。

A) int b[3][5], (*p)[5], (*q)[5]; p=b; q=b;B) float b[3][5], (*p)[3]; p[0]=b[0]; p[2]=*b+4;C) double b[3][5], s[5][3], *q; q=b; s=q;D) int b[10], *q; char *s; q=b; s=b;37.若要对a进行合理的自增运算,则a应具有_______________说明。

A) int a[3][2]; B) char *a[]={"12","ab"}; C) char (*a)[3]; D) int b[10], *a=b;38.下面程序运行时从键盘上输入:1 2 3回车,其输出结果是___________。

#include <stdio.h>void main(){int a[3][2]={0}, (*ptr)[2], i, j;for(i=0; i<2; i++) {ptr=a+i; scanf("%d",ptr); ptr++; }for(i=0; i<3; i++)for(j=0; j<2; j++) printf("%d",a[i][j]);}A) 编译错误信息B) 6102000 C) 123000 D) 10203039.若有定义int x[4][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int (*p)[3]=x;则能够正确表示数组元素x[1][2]的表达式是_______________。

相关文档
最新文档