第8章指针1练习答案

合集下载

第六~八章 概念练习题-附参考答案

第六~八章 概念练习题-附参考答案

第六~第八章基本概念练习题第6章数组一、选择题。

1. 以下对一维数组a的正确定义是:A)char a(10);B) int a[];C)int k=5,a[k];D)char a[3]={‘a’,’b’,’c’};2.以下能对一维数组a进行初始化的语句是: ( )A. int a[5]=(0,1,2,3,4,)B. int a(5)={}C. int a[3]={0,1,2}D. int a{5}={10*1};3.在C语言中对一维整型数组的正确定义为。

A)int a(10); B)int n=10,a[n];C)int n;a[n]; D)#define N 10int a[N];4. 若二维数组a有m列,则在a[i][j]之前的元素个数为A. j*m+iB. i*m+jC. i*m+j-1D. i*m+j+1*5. 下列说法中错误的是A 构成数组的所有元素的数据类型必须是相同的B 用指针法引用数组元素允许数组元素的下标越界C 一维数组元素的下标依次是1、2、3……·D 定义数组时的长度可以是整型常量表达式6. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是A) 3 B) 6 C) 10 D) 207.若有说明:int a[][3]={{1,2,3},{4,5},{6,7}}; 则数组a的第一维的大小为: ( )A. 2B. 3C. 4D.无确定值8.以下定义语句中,错误的是( )A) int a[]={1,2}; B) char *a;C) char s[10]=“test”; D) int n=5,a[n];9.下面程序段的输出结果是: ( )int i;、int x[3][3]={1,2,3,4,5,6,7,8,9};for (i=0;i<3;i++)printf("%d ",x[i][2-i]);A) 1 5 9 B) 1 4 7 C) 3 5 7 D) 3 6 9二.分析题。

第六~八章 概念练习题-附参考答案

第六~八章 概念练习题-附参考答案
A)auto B)static C)extern D)register
11.若有函数定义:
int func()
{
static int m=0;
return m++;
}
以下程序段运行后屏幕输出为()。
int i;
for(i=1;i<=4;i++)
func();
printf("%d",func());
A.0 B.1C.4 D.5
B.函数的定义不可以嵌套,但函数的调用可以嵌套
C.函数的定义和函数的调用均不可以嵌套
D.函数的定义和函数的均可以嵌套
5.以下叙述中正确的是
A)构成C程序的基本单位是函数
B)可以在一个函数中定义另一个函数
C)main()函数必须放在其它函数之前
D)所有被调用的函数一定要在调用之前进行定义
6.用数组名作为函数调用时的实参时,传递给形参的是。
9.下列说法中正确的是:()
A.局部变量在一定范围内有效,且可与该范围外的变量同名。
B如果一个源文件中,全局变量与局部变量同名,则在局部变量范围内,局部变量不起作用。
C.局部变量缺省情况下都是静态变量。
D.函数体内的局部静态变量,在函数体外也有效。
10.未指定存储类别的变量,其隐含的存储类别为()。
main()
{ char s[]=“ABCD”, *P;
for(p=s+1; p<s+4; p++) printf (“%s\n”,p);}
该程序的输出结果是
A) ABCDB) AC) BD)BCD
BCDBCCD
CDCDD
DD

c++面向对象课后答案第8章

c++面向对象课后答案第8章

1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。

1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。

当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。

1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。

1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。

在派生类中采用虚基类或作用域分辨符来消除该问题。

2.简答题2.1 派生类如何实现对基类私有成员的访问?2.2什么是类型兼容规则?2.3派生类的构造函数是怎样的执行顺序,析构函数的执行顺序是如何实现的?2.4继承与组合之间的区别与联系是什么?2.5什么是虚基类?它有什么作用?含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化?3.选择题3.1下面对派生类的描述中,错误的是(D )。

A.一个派生类可以作为另外一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变3.2下列对友元关系叙述正确的是(A)。

A.不能继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系D.提高程序的运行效率3.3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。

A.任何成员B.公有成员和保护成员C.公有成员和私有成员D.私有成员3.4设置虚基类的目的是(B)。

A.简化程序B.消除二义性C.提高运行效率D.减少目标代码3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( C )。

C语言程序设计知识点—第8章 指针结构体与预处理命令

C语言程序设计知识点—第8章 指针结构体与预处理命令
比较两个指针 #include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。

C二级 第8章 指针

C二级 第8章 指针

1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。

因此B选项正确。

3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。

因此C选项正确。

4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。

C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针

C语言程序设计(第3版)何钦铭 颜 晖 第8章  指针

第8章指针【练习8-1】如果有定义”int m, n = 5, *p = &m;”与m = n等价的语句是 B 。

A.m = *p; B. *p = *&n; C. m = &n; D. m = **p;解答:A:p是指向m的指针变量,所以*p等价于m。

即m=m。

B:&n是n的地址,*&n是n的值,即把n的值赋给p指向的值m。

即m=n。

C:&n是n的地址。

即把n的地址赋给m。

D:**p是指p指向的指针所指向的值,在此无意义。

故选B。

【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2, float *psum, float *pdiff),其中op1和op2是输入的两个数,*psum 和*pdiff 是计算得出的和与差。

解答:#include<>void sum_diff(float op1,float op2,float *psum,float *pdiff);int main(void){float op1,op2,sum,diff;printf("Input op1 and op2: ");scanf("%f%f",&op1,&op2);sum_diff(op1,op2,&sum,&diff);printf("%f+%f=%f;%f-%f=%f \n",op1,op2,sum,op1,op2,diff);return 0;}void sum_diff(float op1,float op2,float *psum,float *pdiff){*psum=op1+op2;*pdiff=op1-op2;}【练习8-3】两个相同类型的指针变量能不能相加为什么解答:不能。

高树芳C语言程序设计--第八章

高树芳C语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数

c语言第8章练习题--指针

c语言第8章练习题--指针

1、int *p 的含义是(B)A.p是一个指针, 用来存放一个整型数B.p是一个指针, 用来存放一个整型数据在内存中的地址C.p是一个整型变量D. 以上都不对2、以下函数用来求出两整数之和,并通过形参将结果传回,请填空。

void func(int x,int y, ___int*____ z){ *z=x+y; }3、有如下程序段(B)int *p,a=10,b=1;p=&a; a=*p + b;执行该程序段后,a的值是A. 12B. 11C. 10D. 编译出错4、若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是( C)A) p+1B) a+1C) a++D) ++p5、以下程序运行后的输出结果是(A)void main( ){ int a[ ]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<a+10;p++) printf("%d,",*p);}A)1,2,3,4,5,6,7,8,9,0,B)2,3,4,5,6,7,8,9,10,1,C)0,1,2,3,4,5,6,7,8,9,D)1,1,1,1,1,1,1,1,1,1,6、下面程序的输出是(D)void prtv(int *x)printf("%d\n", ++*x);}main(){ int a=25;prtv(&a);}A) 23 B) 24 C) 25D) 267、有以下函数(B)char fun(char *p){ return p; }该函数的返回值是A) 无确切的值B) 形参p中存放的地址值C) 一个临时存储单元的地址D) 形参p自身的地址值8、下列程序的输出结果是(7)#include<stdio.h>void fun (int *p1, int *p2){ if (*p1>*p2) printf ("%d\n",*p1);else printf ("%d\n",*p2);}void main ( ){ int a=3,b=7;fun (&a, &b);}9、下列程序的运行结果是(B)void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A) 6 3 B) 3 6 C) 编译出错D) 0 010、以下程序调用findmax函数返回数组中的最大值(B)findmax(int *a,int n){ int *p,*s;for(p=a,s=a; p-a<n; p++)if ( ) s=p;return(*s);}main(){ int x[5]={12,21,13,6,18};printf("%d\n",findmax(x,5));}在下划线处应填入的是(B)A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s11、下列程序段的输出结果是(A)void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A) 2 1 4 3 B) 2 1 3 4 C) 1 2 1 2 D) 2 1 1 212、以下程序执行后输出的结果是___84________。

电气控制与可编程序控制器应用技术第8章 综合练习题答案

电气控制与可编程序控制器应用技术第8章 综合练习题答案

第8章三菱FX2N系列PLC功能指令一、判断题(正确打“√”、错误打“×”)(√):1、3-9、12-17;(×):2、10、11。

二、填空题1. FNC00~FNC246 。

2. 10 ,FNC00~FN09 。

3. 2 , FNCl0、FNCl1 , 8,FNC12~FNC19。

4. 4位BCD,BCD、二进。

5. 条件跳转、转子、中断调用。

三、简答题1.在使用跳转指令时应注意什么?(1)在同一程序中一个指针标号只允许使用一次,不允许在两处或多处使用同一标号。

(2)指针P63表示程序转移到END。

(3)跳转指令的执行条件如果使用M8000,则为无条件跳转,因为在PLC运行时M8000为ON。

2.在使用循环指令时应注意什么?控制PLC反复执行某一段程序,只要将这段程序放在FOR、NEXT之间,待执行完指定的循环次数后(由操作数指定),才能执行NEXT指令后的程序。

循环开始FOR指令和循环结束NEXT指令组成了一对循环指令。

循环指令可以反复执行某一段程序,但要将这一段程序放在FOR-NEXT之间,待执行完指定的循环次数后,才执行NEXT下一条指令。

配对后的FOR-NEXT不能再与其他的FOR-NEXT配对。

3.在使用功能指令应注意什么?大多数功能指令有1至4个操作数,有的功能指令没有操作数;[S]表示源操作数,[D]表示目标操作数;如果可使用变址功能,用[S.]和[D.]表示。

用n和m表示其它操作数,它们常用来表示常数K和H。

4.循环指令的操作方法是:(1)FOR和NEXT指令必须成对使用,缺一不可,FOR在前,NEXT在后。

(2)FOR、NEXT循环指令最多可以嵌套5层。

(3)利用CJ指令可以跳出POR、NEXT循环体。

5.使用加法和减法指令时应该注意:(1)每个数据的最高位为符号位(0为正、1为负)。

(2)加法指令有三个标志:零标志(M8020)、借位标志(M8021)和进位标志(M8022)。

操作系统第五版答案第8章复习题及习题解答

操作系统第五版答案第8章复习题及习题解答

虚拟内存8.1 简单分页与虚拟分页有什么区别?简单分页:一个程序中的所有的页都必须在主存储器中程序才能正常运行,除非使用覆盖技术。

虚拟内存分页:不是程序的每一页都必须在主存储器的帧中来使程序运行,页在需要的时候进行读取。

8.2 解释什么是抖动。

虚拟内存结构的震动现象,在这个过程中处理器大部分的时间都用于交换块,而不是执行指令。

8.3 为什么在使用虚拟内存时,局部性原理是至关重要的?可以根据局部性原理设计算法来避免抖动。

总的来说,局部性原理允许算法预测哪一个当前页在最近的未来是最少可能被使用的,并由此就决定候选的替换出的页。

8.4 哪些元素是页表项中可以找到的元素?简单定义每个元素。

帧号:用来表示主存中的页来按顺序排列的号码。

存在位(P):表示这一页是否当前在主存中。

修改位(M):表示这一页在放进主存后是否被修改过。

8.5 转移后备缓冲器的目的是什么?转移后备缓冲器(TLB)是一个包含最近经常被使用过的页表项的高速缓冲存储器。

它的目的是为了减少从磁盘中恢复一个页表项所需的时间。

8.6 简单定义两种可供选择的页读取策略。

在请求式分页中,只有当访问到某页中的一个单元时才将该页取入主存。

在预约式分页中,读取的并不是页错误请求的页。

8.7 驻留集管理和页替换策略有什么区别?驻留集管理主要关注以下两个问题:(1)给每个活动进程分配多少个页帧。

(2)被考虑替换的页集是仅限在引起页错误的进程的驻留集中选择还是在主存中所有的页帧中选择。

页替换策略关注的是以下问题:在考虑的页集中,哪一个特殊的页应该被选择替换。

8.8 FIFO和Clock页替换算法有什么区别?时钟算法与FIFO算法很接近,除了在时钟算法中,任何一个使用位为一的页被忽略。

8.9 页缓冲实现的是什么?(1)被替换出驻留集的页不久又被访问到时,仍在主存中,减少了一次磁盘读写。

(2)被修改的页以簇的方式被写回,而不是一次只写一个,这就大大减少了I/O操作的数目,从而减少了磁盘访问的时间。

第8章++排序+课后习题答案

第8章++排序+课后习题答案

第8章排序1.选择题(1)从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为()。

A.归并排序B.冒泡排序C.插入排序D.选择排序(2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为()。

A.归并排序B.冒泡排序C.插入排序D.选择排序(3)对n个不同的关键字由小到大进行冒泡排序,在下列()情况下比较的次数最多。

A.从小到大排列好的B.从大到小排列好的C.元素无序D.元素基本有序(4)对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为()。

A.n+1 B.n C.n-1 D.n(n-1)/2 (5)快速排序在下列()情况下最易发挥其长处。

A.被排序的数据中含有多个相同排序码B.被排序的数据已基本有序C.被排序的数据完全无序D.被排序的数据中的最大值和最小值相差悬殊(6)对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是()。

A.O(n) B.O(n2)C.O(nlog2n) D.O(n3)(7)若一组记录的排序码为(46, 79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。

A.38,40,46,56,79,84 B.40,38,46,79,56,84C.40,38,46,56,79,84D.40,38,46,84,56,79 (8)下列关键字序列中,()是堆。

A.16,72,31,23,94,53 B.94,23,31,72,16,53C.16,53,23,94,31,72 D.16,23,53,31,94,72(9)堆是一种()排序。

A.插入B.选择C.交换D.归并(10)堆的形状是一棵()。

A.二叉排序树B.满二叉树C.完全二叉树D.平衡二叉树(11)若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。

C语言第8章 指针

C语言第8章 指针
数据类型 *函数名(形参表) { 函数体; }
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果

第8章习题解答

第8章习题解答

第8章思考题及习题8参考答案一、填空1. 单片机存储器的主要功能是存储和。

答:程序、数据。

2.假设外部数据存储器2000H单元的内容为80H,执行下列指令后累加器A中的内容为。

MOV P2,#20HMOV R0,#00HMOVX A,@R0答:80H。

3.在存储器扩展中,无论是线选法还是译码法最终都是为扩展芯片的端提供控制信号。

答:片选。

4.起止范围为0000H~3FFFH的数据存储器的容量是 KB。

答:16KB。

5.在AT89S52单片机中,PC和DPTR都用于提供地址,但PC是为访问存储器提供地址,而DPTR是为访问存储器提供地址。

答:程序、数据。

6.11条地址线可选个存储单元,16KB存储单元需要条地址线。

答:2K,14。

7.4KB RAM存储器的首地址若为0000H,则末地址为 H。

答:0FFF。

8.若单片机外扩32KB 数据存储器的首地址若为4000H,则末地址为 H。

答:BFFF9. 设计一个以AT89S52单片机为核心的系统,如果不外扩程序存储器,使其内部8KB闪烁程序存储器有效,则其引脚应该接。

答:EA*,+5V10.74LS138是具有3个输入的译码器芯片,其输出常作片选信号,可选中片芯片中的任一芯片,并且只有1路输出为电平,其它输出均为电平。

答:8,低,高;二、单选1.区分AT89S51单片机片外程序存储器和片外数据存储器的最可靠方法是。

A.看其位于地址范围的低端还是高端B.看其离AT89S51单片机芯片的远近C.看其芯片的型号是ROM还是RAMD.看其是与RD信号连接还是与PSEN信号连接答:D2.访问片外数据存储器的寻址方式是。

A.立即寻址B.寄存器寻址C.寄存器间接寻址D.直接寻址答:C3.若要同时扩展4片2KB的RAM和4片4KB的ROM,则最少需要根地址线。

A、12B、13C、14D、154.当EA=1时,AT89S52单片机可以扩展的外部程序存储器的最大容量为。

A. 64KB B.60KB C.58KB D.56KB答:D5. 若某数据存储器芯片地址线为12根,那么它的存储容量为。

第8章习题解答

第8章习题解答

第8章习题解答一. 选择题1. 关于类和对象,不正确的说法是()A. 类是一种数据类型,它封装了数据和函数B. 类是对某一类对象的抽象C. 可以基于类这种数据类型定义类的引用D. 一个类的对象只有一个【答案】D【解析】类是一种数据类型,可以基于“类”这种数据类型定义多个称为“对象”的变量。

2. 类定义的外部,可以被访问的类的成员有()A. public 的类成员B. public或private的类成员C. private或protected的类成员D. public或private 的类成员【答案】A【解析】类的成员数据或成员函数的访问属性分为三种情况:private、public和protected,即私有访问属性、公有访问属性和保护访问属性,类定义的外部只能访问公有访问属性的成员。

3 关于this 指针,说法错误的是()A. this指针必须显式说明B. 当创建一个对象后,this 指针就指向该对象C. 成员函数拥有this指针D. 静态成员函数拥有this指针【答案】D【解析】this指针是一种特殊的指针,它指向成员函数当前操作的数据所属的对象。

不同的对象调用相同的成员函数时,this指针将指向不同的对象,也就可以访问不同对象的成员数据。

而静态成员函数是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。

因此,可以在没有任何对象存在的情况下,可以使用静态成员函数,而使用this指针必须有明确的对象所指。

4. 调用形式参数为普通对象的函数时,系统会自动调用相应类的()A. 名字不同于类名的一般成员函数B. 构造函数C. 析构函数D. 拷贝构造函数【答案】D【解析】若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数实现拷贝赋值。

5. 定义某类的对象后,再删除该对象,系统会自动调用()A. 名字不同于类名的一般成员函数B. 拷贝构造函数C. 构造函数D. 析构函数【答案】D【解析】当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间。

chap8(指针)

chap8(指针)

务必记住:*(a+i) 和 a[ i] 是等价的。
如果 a 是一维数组名,则a[ i]代表第 i+1个元素所占的 内存单元。但如果a是二维数组,则a[ i ]代表一维数组名, a[i]本身是不占用内存单元的, 也不存放元素值,而只是 一个地址。 a、a+i、a[ i]、*(a+i)、*(a+i)+j、a[ i]+j都是地址, 而*(a[ i]+j)、*(*(a+i)+j)是二维数组元素a[ i][ j]的值。
二、 字符串指针作函数参数
可以用地址传递的方式,即用字符数组名作 参数或用指向字符串的指针变量作参数,将一个 字符串从一个函数传递到另复制。 用字符数组作参数 void copy_string( from , to ) char from[ ] , to[ ] ; { int i = 0 ; while ( from[i] != „\0‟ ) { to[i] = from[i] ; i + + ; } to[i] = „\0‟ ; 运行结果: } string_a = I am a teacher. string_b = I am a teacher. main( ) {char a[ ] = “I am a teacher.” ; char b[ ] = “you are a student.” ; copy_string( a , b) ; printf( “string_a = %s\nstring_b = %s\n”,a,b); }
形参用字符指针变量 void copy_string(from , to) char *from , *to ; { for ( ; *from != „\0‟; from++; to++) *to = *from ; *to = „\0‟; } main( ) { char *a= “I am a teacher.”; char *b= “you are a student.”; copy_string(a,b); printf( “string_a = %s\nstring_b = %s\n”,a,b) ; }

C语言程序设计教程 杨路明 答案第8章

C语言程序设计教程 杨路明 答案第8章
getch();
}
9、
/*输入n个数,并排序后输出。*/
#include<stdio.h>
#include<string.h>
int *paixu(int data[],int n)
{ int i,*p1,*p2,temp;
p1=data;
for(p1=data;p1<data+n-1;p1++)
printf("Please input a string: ");
gets(a);
p=a;q=b;
printf("\n\nPlease input m and n(like 1,1): ");
scanf("%d,%d",&m,&n);
if( (strlen(a)>=m) && ((strlen(a)-m+1)>=n) )/*复制的位置要符合要求*/
#include<stdio.h>
void main()
{
int a[100],temp1=0,temp2=0,max=0,min=0,k;
printf("\nPlease input 8 ge shu: ");
for(k=0;k<8;k++)
{ scanf("%d",&a[k]);
{
t=(int)(*p-48);
a[i]=a[i]*10+t;
p++;
if((*p)>'9'||(*p)<'0')

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针
}
8.5.3 指针与二维数组
• 二维数组其实可以看成由一维数组构造而成。就相当于 几个队列构成一个方阵,方阵由队列组成,队列由具体 的元素--人组成。
• 一级指针只能管理队列,如果管理方阵,则需要二级指 针。
•int a=1000,*pa,**ppa; • pa=&a; • ppa=&pa;
• *(*(ppa)) ≡ *(pa) ≡ a ≡ 1000
• p是二级指针 • *p相当于*(p+0),级别降低为一级指针,相当于p[0] • **p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),
也相当于p[0][0]
• p[1][2],相当于*(*(p+1)+2) • &p[1][2], 级别提升为一级指针,相当于:
• p[1]+2,*(p+1)+2 • &p[1],级别提升为二级指针,相当于:
f=f4; printf("a/b=%d\n",f(a,b));
8.5 指针与数组
• 8.5.1 指针与字符数组 • char str[100]= "Hello World"; • char *p=str; • 字符w可以有如下多种表示形式: • str[6] • *(str+6) • p[6] • *(p+6)
【例8-2】演示指针和数组的关系。
#include <stdio.h>
接可存取,由于p中存储的是x的信息。访问p可以获取x的信 息,再对银行存款进行操作。
8.1 借钱的故事
8.2 指针的概念
• C语言允许使用变量名、数组名[下标]、函数名等标 识符来访问内存

C语言程序设计第八章 指针的使用

C语言程序设计第八章 指针的使用

第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。

学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。

(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。

(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。

(4)了解指针与字符串的关系,能熟练使用指针处理字符串。

(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。

(6)指向指针的指针的运用。

【学习导航】本章的在整个课程中的位置如图5-1所示。

图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。

指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。

有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。

8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。

既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。

指针变量和其他类型的变量的区别是:指针变量存储的是地址。

所以要学好指针,就一定要明白数据在内存中是如何存储的。

计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。

地址就是内存区中对每个字节的编号。

下面通过两个整型变量来说明。

整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。

把变量所占用的存储单元首字节的地址作为变量的地址。

C语言中利用取地址运算符“&”获取变量的存储地址。

例如,&c将返回c的首地址;&x将返回x的首地址。

2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。

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

指针1
选择题
1.如下程序段:
int *p ,a=10 ,b=1 ;
p=&a ;a=*p+b ;
执行该程序段后,a 的值为。

A. 12
B. 11
C. 10
D. 编译出错
2.若有以下定义和语句:
double r=99 ,*p=&r ;
*p=r ;
则以下正确的叙述是。

A. 以下两处的*p 含义相同,都说明给指针变量p 赋值
B. 在"double r=99,*p=&r;"中,把r 的地址赋值给了p 所指的存储单元
C. 语句"*p=r;"把变量r 的值赋给指针变量p
D. 语句"*p=r;"取变量r 的值放回r 中
3.若有说明int *p,a;则能通过scanf语句正确给a存入数据的程序段是()。

A.p=&a; scanf(“%d”,p);
B.scanf(“%d”,a);
C.p=&a; scanf(“%d”,*p);
D.*p=&a; scanf(“%d”,p);
4.若int x ,*pb;,则正确的赋值表达式是。

A. pb=&x
B. pb=x;
C. *pb=&x;
D. *pb=*x
5.若有说明:int i, j=2,*p=&i;,则能完成i=j 赋值功能的语句是。

A. i=*p;
B. *p=*&j;
C. i=&j;
D. *p=i;
6.若已定义:int a[9] ,*p=a;并在以后的语句中未改变p 的值,不能表示a[1]地
址的表达式是()。

A. p+1
B. a+1
C. a++
D. ++p
7.若有以下说明:int a[10]={1,2,3,4,5,6,7,8,9,10} ,*p=a ;
则数值为6 的表达式是( )。

A. *p+6
B. *(p+6)
C. *p+=5
D. p+5
8.以下程序段的运行结果是()。

int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p=&a[3],*q;
q=p+2;
printf(“%d”,*p+*q);
A.16
B.10
C.8
D.6
9.若有以下的定义:
int a[ ]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,*p=a ;
则值为3 的表达式是。

A. p+=2 ,*(p++)
B. p+=2 ,*++p
C. p+=3 ,*p++
D. p+=2 ,++*p
10.若有以下定义和语句,且0≤i<10则对数组元素的错误引用是。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p,i;
p=a;
A. *(a+i)
B. a[p-a]
C. p+i
D. *(&a[i]) 读程序写结果题
1.#include <stdio.h>
void main()
{ int *p1,*p2,*p;
int a=5,b=8;
p1=&a; p2=&b;
if(a<b) { p=p1; p1=p2; p2=p;}
printf("%d,%d\n",*p1,*p2);
printf("%d,%d\n",a,b);
}
2.#include <stdio.h>
void main()
{ int *p1,*p2,*p;
int a=5,b=8,c;
p1=&a; p2=&b;p=&c;
if(a<b) { *p=*p1; *p1=*p2; *p2=*p;}
printf("%d,%d\n",*p1,*p2);
printf("%d,%d\n",a,b);
}
3.#include <stdio.h>
void main()
{ int a=3,b=4,*p=&a,*q=&b;
*p=*q;
printf(“%d,%d,%d,%d\n”,a,b,*p,*q);
(*q)++;
p=q;
printf(“%d,%d,%d,%d\n”,a,b,*p,*q);
}
4.#include<stdio.h>
void main()
{ int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,0} ,*s=a;
int i , j , t ;
i=1; j=8;
while(i<j)
{ t= *(s+ i) ;
*(s+i)= *(s+j) ;
*(s+j)=t ;
i++ ; j-- ;
}
for(i=0 ; i<10 ; i++) printf("%d" , *(a+i));
printf("\n") ;
}
5.#include<stdio.h>
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("%d ,%d ,%d\n" ,a ,b ,c) ;
}
程序填空题
1.以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大
值,输出到屏幕上,请填空。

#include”stdio.h”
void main()
{
int x,y,z,max,*px,*py,*pz,*pmax;
scanf("%d%d%d",&x,&y,&z);
px=&x;
py=&y;
pz=&z;
pmax=&max;
_______
if(*pmax<*py)*pmax=*py;
if(*pmax<*pz)*pmax=*pz;
printf("max=%d\n",max);
}
*pmax=*px; 或*pmax=x;
2.下面程序输出数组中的最大值,由s指针指向该元素。

void main()
{ int a[10]={6,7,2,9,1,10,5,8,4,3},*p,*s;
for(p=a,s=a;;p++)
if()s=p;
printf("The max:%d",*s):
}
编程题
1.在一个一维数组中查找是否存在某个数值(在主函数内初始化数组,由键盘输入要查找
的值,用指针来做查找过程)
2.编写一个函数int fun(int a[],int n,float *p),功能是求出一个整形数组的最大值和平均值,
最大值通过返回值返回,平均分存放到p指向的变量。

并写出main函数进行函数调用。

相关文档
最新文档