第五章_数组与指针习题

第五章_数组与指针习题
第五章_数组与指针习题

第五章数组与指针习题

一、.基本概念与基础知识自测题

5.1 填充题

5.1.1 数组定义时有三个要素:数组名,数组元素的(1)和数组元素的(2)。按元

素在数组中的位置进行访问,是通过(3)进行的,称为(4)或(5)访问。

为了使数组声明中数组的大小修改更为方便,总是将(6)用于声明数组长度。

答案:(1)类型

(2)数量

(3)下标运算符

(4)下标

(5)索引

(6)常变量

5.1.2 C/C++中的多维数组用的是一个(1)的定义,即多维数组的基本定义是(2)构

成的数组,三维数组的元素是(3)。

答案:(1)嵌套

(2)以数组作为元素

(3)二维数组

5.1.3 计算机内存是一维编址的,多维数组在内存中的存储(1),C/C++多维在内存中

的排列是(2)方式,即越(3)的下标变化(4)。设数组a有m行n列,每个元素占内存u个字节,则a[i][j]的首地址为(5)+ (6)。

答案:(1)必须要转化为一维方式,

(2)按行方式

(3)右

(4)越快

(5)a数组的首地址

(6)(i*n+j)*u

5.1.4 对于多维数组,(1)的大小是确定的,所谓“不检查数组边界”只是不检查(2)

的边界,而(3)的边界是在控制之中的,所以多维数组名作为函数的参数只可以(4)缺省。

答案:(1)较低各维的

(2)最高维(第一维)

(3)较低各维

(4)最高维

5.1.5 指针变量保存了另一变量的(1)值,不可以任意给指针变量赋一个地址值,只能赋

给它(2)和(3)的地址。使用变量名来访问变量,是按(4)来直接存取变量称为(5)方式;而借助指针变量取得另一变量的地址,访问该变量称为(6)方式。

答案:(1)地址

(2)NULL

(3)已经分配了内存的变量的地址

(4)按变量的地址

(5)直接访问

(6)间接访问

5.1.6 固定指向一个对象的指针,称为(1),即(2),定义时const放在(3)。

而指向“常量”的指针称为(4),指针本身可以指向别的对象,但(5),定义时const放在(6)。

答案:(1)指针常量

(2)指针本身是常量

(3)const放在类型说明之后,变量名之前

(4)常量指针

(5)不能通过该指针修改对象

(6)const放在类型说明之前

5.1.7 数组名在表达式中被自动转换为指向(1)的指针常量,数组名是地址,但数组名

中放的地址是(2),所以数组名(3)。这样数组名可以由(4)来代替,C++这样做使用时十分方便,但丢失了数组的另一要素(5),数组名是指向数组(6)的指针,而不是指向数组(7)的。编译器按数组定义的大小分配内存,但运行时对(8)不加检测,这会带来无法预知的严重错误。

答案:(1)数组第一个元素

(2)不可改变的

(3)称指针常量

(4)指针

(5)数组元素的数量

(6)元素

(7)整体

(8)对数组的边界不加检测

5.1.8 有一个三维数组:

int z3d[2][3][4];

给出指向三维数组第i行第j列第k页元素的指针的三种表达方式(1),(2),(3)。再给出这些元素的三种表达方式(4),(5),(6)。

答案:(1)z3d[i][j]+k或&z3d[i][j][k]

(2)*(z3d[i]+j)+k

(3)*(*(z3d+i)+j)+k

(4)z3d[i][j][k]或*(z3d[i][j]+k)

(5)*(*(z3d[i]+j)+k)

(6)*(*(*(z3d+i)+j)+k)

5.2简答题

5.2.1 物理上,C++是怎样访问数组元素的?请对访问方法作简单介绍。

答:物理上,C++语言的下标运算符[ ]是以指针作为操作数的,a[i]被编译系统解释为*(a+i),即表示为a所指(固定不可变)元素向后第i个元素。无论我们是以下标方式或指针方式存取

指针数组及指向一维数组的指针讲解

一、指针数组及指向一维数组的指针(数组指针)讲解 1、数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 2、指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。这样赋值是错误的:p=a;只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; for(i=0;i<3;i++) p[i]=a[i]; 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p [1]、p[2]所以要分别赋值。 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。 还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。 比如要表示数组中i行j列一个元素: *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j] 优先级:()>[]>* 例1、下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。 #include #include #define N 4

(完整word版)数据结构第五章数组和广义表习题及答案

习题五数组和广义表 一、单项选择题 1.常对数组进行的两种基本操作是() A.建立与删除 B. 索引与修改 C. 查找与修改 D. 查找与索引2.对于C语言的二维数组DataType A[m][n],每个数据元素占K个存储单元,二维数组中任意元素a[i,j] 的存储位置可由( )式确定. A.Loc[i,j]=A[m,n]+[(n+1)*i+j]*k B.Loc[i,j]=loc[0,0]+[(m+n)*i+j]*k C.Loc[i,j]=loc[0,0]+[(n+1)*i+j]*k D.Loc[i,j]=[(n+1)*i+j]*k 3.稀疏矩阵的压缩存储方法是只存储 ( ) A.非零元素 B. 三元祖(i,j, aij) C. aij D. i,j 4. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。 A. 1175 B. 1180 C. 1205 D. 1210 5. A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。 A. i(i-1)/2+j B. j(j-1)/2+i C. i(j-i)/2+1 D. j(i-1)/2+1 6. 用数组r存储静态链表,结点的next域指向后继,工作指针j指向链中结点,使j 沿链移动的操作为( )。 A. j=r[j].next B. j=j+1 C. j=j->next D. j=r[j]-> next 7. 对稀疏矩阵进行压缩存储目的是()。 A.便于进行矩阵运算 B.便于输入和输出 C.节省存储空间 D.降低运算的时间复杂度 8. 已知广义表LS=((a,b,c),(d,e,f)),运用head和tail函数取出LS中原子e的运算是( )。 A. head(tail(LS)) B. tail(head(LS)) C. head(tail(head(tail(LS))) D. head(tail(tail(head(LS)))) 9. 广义表((a,b,c,d))的表头是(),表尾是()。 A. a B.() C.(a,b,c,d) D.(b,c,d) 10. 设广义表L=((a,b,c)),则L的长度和深度分别为()。 A. 1和1 B. 1和3 C. 1和2 D. 2和3 11. 下面说法不正确的是( )。 A. 广义表的表头总是一个广义表 B. 广义表的表尾总是一个广义表 C. 广义表难以用顺序存储结构 D. 广义表可以是一个多层次的结构 二、填空题 1.通常采用___________存储结构来存放数组。对二维数组可有两种存储方法:一种是以___________为主序的存储方式,另一种是以___________为主序的存储方式。 2. 用一维数组B与列优先存放带状矩阵A中的非零元素A[i,j] (1≤i≤n,i-2≤j≤i+2),B 中的第8个元素是A 中的第_ _行,第_ _列的元素。

数组名和指针的区别(小结)

在Win 32 中: 1. (1) 对数组名进行sizeof运算时,结果是整个数组占用空间的大小; (2) 但是数组作为函数参数时,对数组名进sizeof 运算,结果为4; (2) 对指针进行sizeof运算得到的值是编译器分配给指针(也就是一个地址)的内存空间,即为4。 2. (1) 对数组名作&运算,得到的还是数组第一个元素的地址; (2) 对指针取地址时得到的结果是指针所在的地址,也就是指向这个指针的指针,与指针的值不同。 BOOL mytest(char param[100]) { //参数数组名:paramBytes int paramBytes = sizeof(param); printf("paramBytes \t%d\n",paramBytes); //数组:mych1[] char mych1[] = "abcdefg123"; //若定义为mych1[100] int mych1Bytes = sizeof(mych1); printf("mych1Bytes \t%d\n",mych1Bytes);//输出:100 //数组:mych[200] char mych[200] = {0}; int myBytes = sizeof(mych); printf("myBytes \t%d\n",myBytes); printf("---addr \t%d\n",mych); printf("---addr \t%d\n",&mych); //指针:pch char* pch = "12345abc"; int pchBytes = sizeof(pch); printf("pchBytes \t%d\n",pchBytes); //pch = mych; printf("---addr \t%d\n",pch); printf("---addr \t%d\n",&pch); return TRUE; } 运行:

数组及指针 知识点总结

第9章数组 第1课 知识点一 定义一维数组 格式: 类型名数组名[元素个数] 例1 定义一个包含4个整数的数组a int a[4]; 例2 定义一个包含3个双精度数的数组b double b[3]; 注意: C语言中数组的下界从0开始计数。 例如: a[4]的4个元素分别为a[0]、a[1]、a[2]、a[3] 知识点二 一维数组的初始化 用一对大括号将数组的初值括起来。 例1 int a[3]={1, 2, 3}; 此例中a[0]值为1、a[1]值为2、a[2]值为3

例2 int a[5]={0}; 此例中数组a的全部元素值均为0 例3 int a[3]={1, 2, 3, 4}; 此例中由于初值个数多于数组元素个数,所以非法。例4 int a[ ]={0, 0, 0, 0}; 此例中省略数组元素个数,初值为4个0 等价于int a[4]={0}; 注意: 数组名是一个常量值,不能对它赋值。 例如: int a[3]; a=5; 此语句非法,应改为a[0]=5; 知识点三 一维数组应用 例1 从键盘上输入10个整数,输出最大数和最小数。 #include main() { int a[10],i,max,min; printf("请输入10个整数:\n");

for(i=0;i<=9;i++) scanf("%d",&a[i]); max=a[0]; min=a[0]; for(i=1;i<=9;i++) { if(a[i]>max) max=a[i]; if(a[i]

指针与数组练习题

指针与数组练习题 1、下面程序实现如下功能:输入一个整数字符串转换为一个整数值,如”1234”转换为1234,”-1234”转换为-1234。读懂main函数,编写转换函数chnum #include #include void main() { char s[6]; int n; int chnum(char *p); gets(s); if (*s=='-') n=-chnum(s+1); else n=chnum(s); printf("%d\n",n); } int chnum(char*p) { int sum=0; while(*p!='\0') { if(*p>='0'&&*p<='9') sum=sum*10+*p-'0'; p++; } return sum; } 2、从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。读懂以下main函数,编写相应的函数del16和htod。 #include #include void main() { char s1[10],s2[10]; void del16(char*,char*); int htod(char*); gets(s1); //读入一字符串 del16(s1,s2); //去掉所有非十六进制字符到s2 printf("%d\n",htod(s2)); //把s2转换为10进制 }

void del16(char*s1,char*s2){ for(;*s1!='\0';s1++) if(*s1>='0'&&*s1<='9'||*s1>='a'&&*s1<='f'||*s1>='A'&&*s1<='F'){ *s2 = *s1; s2++;} *s2='\0'; } int htod(char*s2){ int sum=0; for(;*s2!='\0';s2++){ if(*s2>='0'&&*s2<='9') sum=sum*16+*s2-'0'; else if(*s2>='a'&&*s2<='f') sum=sum*16+*s2-'a'+10; else if(*s2>='A'&&*s2<='F') sum=sum*16+*s2-'A'+10; } return sum; } 3、编写函数insert(char *s1,char *s2,int pos),实现在字符串s1中的指定位置pos处插入字符串s2。 Happy Year New 7 Happy New Year #include #include int main(void) { void insert(char *s1,char *s2,int pos); char s1[80],s2[80]; int pos; gets(s1); gets(s2); scanf("%d",&pos); insert(s1,s2,pos); puts(s1); return 0; } void insert(char *s1,char *s2,int pos) {

C语言中指针、数组和引用例子实例

一、指针:内容是指示一个内存地址的变量;类型是指示编译器怎么解释指针内容指向地址中的内容,以及该内存区域有多大; 例子: [cpp] int i = 0; int * pi = &i; printf(“pi = %x \n”, pi); // 打印pi的内容: 0x2000 printf(“*pi= %d \n” , *pi); // 打印pi指向地址中的值: 5 printf(“&pi= %x \n”, &pi); // 打印pi的地址: 0x100 从汇编的角度来看,指针是这样的: int i = 0; 010E139E mov dword ptr [i],0 int * pi = &i; 010E13A5 lea eax,[i] 010E13A8 mov dword ptr [pi],eax 二、数组:是一个单一数据类型对象的集合。其中单个对象没有被命名,通过索引访问。 数组名和指针的区别:数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组。数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量。指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址 注意:虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改,如下:天骄无双:https://www.360docs.net/doc/a516410488.html, [cpp] int intArray[10]; intArray++; // 错误 “指针和数组等价”说的是什么?索引操作相同,例如:p[2]; a[2]; 三、引用(reference)是一个对象的别名。用对象初始化引用后,对象的名字和引用都指向该对象; 引用是如何实现的?从汇编语言的角度来看,指针和引用是一样的: [cpp] int i = 0; 00E9139E mov dword ptr [i],0 int & ref = i; 00E913A5 lea eax,[i] 00E913A8 mov dword ptr [ref],eax int * pi = &i; 00E913AB lea eax,[i] 00E913AE mov dword ptr [pi],eax 指针和引用的区别(从C++使用角度来看): 不存在空引用 引用要初始化 引用初始化后,不能指向另一个对象 这是由编译阶段保证的。 备注:一个指向非常量的引用不能用字面值或者临时值初始化;但是一个指向常量的引用可以。天骄无双:https://www.360docs.net/doc/a516410488.html,

实验三 数组与指针实验

实验三数组与指针实验 【实验目的】 1.学习使用数组数据对象。 2.掌握指针的使用方法。 3.学习通过动态内存分配实现动态数组的定义和使用,并体会指针在其中的作用。4.练习通过Debug观察指针的内容及其所指对象的内容。 【实验内容】 1.运行下列程序,观察运行结果。 (1)#include class ArrayElem { int x; public: ArrayElem(int i){x=i;} //带参数的构造函数 int getx(){return x;} }; int main() { ArrayElem obs[4] ={-1,-2,-3,-4}; //创建对象数组并初始化 for(int i=0;i<4;i++) cout<<"obs["< class NumClass { int num; public: void set_num(int val){num=val;} void show_num(){cout<<"The num is :"<set_num(20);p->show_num(); //通过指针调用成员函数 return(0); } (3)#include class NumClass

第五章 数组和广义表

第5章数组和广义表习题 一、选择题 1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为(B)。 i×(i-1)/2+j-1~~~~(i>=j) 8×7÷2+5=33因为a11从1开始所以要加1 A. 13 B. 33 C. 18 D. 40 2. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( A)。 所求=a+(j*n+j)*l A. 1175 B. 1180 C. 1205 D. 1210 3. 若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(i

变量的指针和指针变量的区别是什么

2变量的指针和指针变量的区别是什么。 答;一个变量的地址指出了变量的存储单元在内存中的具体位置,能对变量进行存取操作。这个变量的地址就是变量的指针。指针是一种具有特殊意义的整型数,指针不能存放在一般的整型变量中,必须存放在专门指针的变量中,这类变量就是指针变量。 3 一维数组元素的引用有哪些方式。 答;下标法、地址法、指针法 4 2维数组列地址有哪些计算方法。 答;1 根据数组元素所在的行计算出行地址,然后把行地址转换成行中首元素的地址,再根据数组元素所在的列计算数组元素的地址。 2 根据2维数组的数组元素在存储空间上按行连续存放的特点,每个数组元素的地址等于2维数组元素的首元素地址加上该数组元素相对于首元素位置的偏移量。 3把2维数组的每一行当作一个一维数组,用一维数组元素地址的计算方法计算相应的2维数组元素的地址。 第9章结构体与共用体 1 什么是链表。其中单向链表具有哪些特点。 答;链表是若干个同样类型的结构通过依次串接方式构成的一种动态数据结构。链表中的每一个结构体数据成为结点,链表可以分成单向链表和双向链表 单向链表的特点;1 链表中的结点数据可以改变的 2 结点占用的内存是动态分配内存和动态释放内存函数。 2 对单向链表的常用操作有哪些。 答;对单向链表的常用操作有建立、显示、插入,删除和查找。 3 什么是共用体。 答;共用体是一个集合体。它的各个成员的数据类型可以是不相同的,所有成员共享同一段存储空间,存储空间的大小取决存储单元最大的成员的数据类型。 4 指向结构体类型变量的指针变量引用形式有哪些。 答;有两种形式;【星号指针变量名】。成员名和指针变量名-大于号成员名。 第10章位运算及编译预处理 1 C提供的编译预处理功能有哪些。如何实现。 答;功能有三种;宏定义、文件包含和条件编译,分别用宏定义命令、文件包含命令、条件编译命令实现。 2 文件包含的基本功能是什么。 答;文件包含处理是一个源文件可以将另一个源文件的全部内容包含到本文件中来,作为本文件的一部分,这可以节省程序设计人员的重复劳动。 【3【在C语言中提供了几种什么样的位运算符。 答;-、小于小于、大于大于、 4 文件包含需要注意哪些问题 答;一个井include命令只能指定一个被包含文件,包含多个文件侧需多个井include命令;文件包含可以嵌套,即一个被包含文件中可以包含另一个被包含的文件;在井include命令中,文件名可以用双引号或尖括号括起来。 第11章文件 1 文件的结束标志有哪些。 答;每个文件都有一个结束标志。当文件的位置指针移到文件的结束标志处时,表示文件结束。如何测试文件是否结束,常有2种方法 1 ASCII码文件的结束标志用【-1】表示。

C语言指针数组函数练习(含参考答案)

作业(使用指针、数组、函数完成) 1. 编写一个通用函数,该函数可以实现判断:一个含有五位数字的整数是否是回文数。回文数的含义是从左向右与从右向左看,数是相同的。如:23732是回文数,而23564则不是。编写主程序调用该函数实现求所有5位数字中满足条件的数的个数。 #include int Judge(int num) { int w,q,b,s,g; w=num/10000; q=num%10000/1000; s=(num%100)/10; g=num%10; if((w==g)&&(q==s)) return 1; else return 0; } void main() { int count=0; int i; for(i=10000;i<=99999;i++) if(Judge(i)) count++; printf("%d\n",count); } 2.编写一个通用函数,该函数可以实现对数值型数组的倒序。倒序的含义是把数组的元素值前后颠倒。例数组:20,19,18,15,13,10倒序的结果为:10,13,15,18,19,20。编写主程序,数组初始化方式不限,并输出,然后调用该函数实现倒序后再输出倒序的结果。#include #define N 6 void Transfer(double *b,int n) { double temp; double *i=b; double *j=b+n-1; while(j>i) { temp=*i; *i=*j; *j=temp; i++;

j--; } } void main() { double array[N]={20,19,18,15,13,10}; int i; for(i=0;i #include double Cal(double *p,int n) { int i,j; double sum=0; for(i=0;i

计算机二级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)15 2、有以下程序 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)8 3、有以下程序 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)60 4、设有定义语句 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 10

第5章 数组习题

第 5 章数组和广义表 一、选择题 2. 有一个二维数组A[1:6,0:7] 每个数组元素用相邻的6个字节存储,存储器按字节编址, 那么这个数组的体积是(①)个字节。假设存储数组元素A[1,0]的第一个字节的地址是0, 则存储数组A的最后一个元素的第一个字节的地址是(②)。若按行存储,则A[2,4]的第 一个字节的地址是(③)。若按列存储,则A[5,7]的第一个字节的地址是(④)。就一般情 况而言,当(⑤)时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。供选择的 答案: ①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120 G. 156 H. 234 I. 276 J. 282 K. 283 L. 288 ⑤: A.行与列的上界相同 B. 行与列的下界相同 C. 行与列的上、下界都相同 D. 行的元素个数与列的元素个数相同 3. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10, 数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 4. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存 储单元,基地址为10,则LOC[5,5]=()。 A. 808 B. 818 C. 1010 D. 1020 5. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000 的内存单元中,则元素A[5,5]的地址是( )。 A. 1175 B. 1180 C. 1205 D. 1210 6. 有一个二维数组A[0:8,1:5],每个数组元素用相邻的4个字节存储,存储器按字节编址, 假设存储数组元素A[0,1]的第一个字节的地址是0,存储数组A的最后一个元素的第一个字 节的地址是(①)。若按行存储,则A[3,5]和 A[5,3]的第一个字节的地址是(②) 和(③)。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址是(④)和(⑤)。 ①-⑤:A.28 B.44 C.76 D.92 E.108 F.116 G.132 H.176 I.184 J.188 13. 设二维数组A[1.. m,1.. n](即m行n列)按行存储在数组B[1.. m*n]中,则二维数 组元素A[i,j]在一维数组B中的下标为( )。 A.(i-1)*n+j B.(i-1)*n+j-1 C. i*(j-1) D. j*m+i-1 15. 数组A[0..4,-1..-3,5..7]中含有元素的个数()。【中山大学 1998 二、5(2分)】 A. 55 B. 45 C. 36 D. 16 二、判断题 1.数组不适合作为任何二叉树的存储结构。(×) 2. 从逻辑结构上看,n维数组的每个元素均属于n个向量。(√) 4. 数组是同类型值的集合。(×) 5. 数组可看成线性结构的一种推广,因此与线性表一样,可以对它进行插入,删除等操作。(×) 三、填空题 1. 数组的存储结构采用_______存储方式。

指针与数组 函数的组合

指针和数组 ? ? 1.指针数组:是其数组元素为指针的数组。记住:是一个存放着指针的数组,而不是一个指针 ?定义格式为:数据类型* 数组名[数组长度] ?如:int * a[10] ; [ ]的优先级高于*,意味着使得a是一个指针数组,表示具有10个元素的数组,每个元素是一个指向int 型的指针。 ? ?2,指向数组的指针:是一个指针,指向的是一个数组。 ?定义格式为:数据类型(*数组名) [数组长度] ?如:int (*a) [10];*先于a 结合,意味着a 是一个指针,指向具有10个int 值的数组, ? ? ?指针与函数 ? ?1, 函数的指针:首先它是一个指针,指向函数的入口地址;在C语言中,函数名就是来标识函数的入口地址。 ?与指向数组的指针不同,在数组中,可以对数组中的元素访问,可以进行算术运算。 而在函数中,只需考虑函数的入口地址,而不考虑函数中某具体指令或数据所在存 储单元的地址,即不能进行算术运算 ?定义格式:存储类型数据类型(*函数名) ( ) ?如:static int (*p) (); ?存储类型表示函数在文件中的存储方式 ?数据类型表示被指函数的返回值的类型 ?最后的空括号表示指针变量所指的是一个函数 ? ?如何用指向函数的指针变量的方式来调用相应的函数: ?1), 使用前,必须先定义并赋值 ?2), 指向函数的指针定义形式中的数据类型必须和赋给它的函数返回值类型相同 ?3), 指向函数的指针只能指向函数的入口,而不能使用*(p+1) 来表示函数的下一命令?4), 在函数指针赋值时,只需给出函数名而不需给参数,如p = max; ?5), 调用时,只需将(*p) 代替函数名即可,在p 后面的括号中根据需要写上实参,如: c = (*p) (a,b) ; ?如下程序:求直角三角形的斜边 ?#include ? #include ?main() ?{ ? int a ,b ,c , f() , (*f1)(); ? a = 3; b = 4;

C语言 数组和指针练习题

若当堂没做完,下周四之前上交也可。 至ftp://211.64.82.253/ 用户名和密码:stu C语言程序设计练习题——数组 一、选择题 77、以下对一维数组a的正确说明是_d ___ A、char a(10); B、int a[ ]; C、int k=5,a[k]; D、char a[ ]={'a' , 'b' , 'c'}; 78、若有说明语句:int a[2][4];,则对a数组元素的正确引用是_a___ A、a[0][3] B、a[0][4] C、a[2][2] D、a[2][2+1] 79、以下能对二维数组y进行初始化的语句是_b__ A、static int y[2][ ]={{1,0,1}, {5,2,3}}; B、static int y[ ][3]={{1,2,3}, {4,5,6}}; C、static int y[2][4]={{1,2,3}, {4,5} , {6}}; D、static int y[ ][3]={{1,0,1,0}, { }, {1,1}}; 80、若有说明语句:int y[ ][4]={0,0};则下面叙述不正确的是_d___ A、数组y的每个元素都可得初值0 B、二维数组y的行数为1 C、该说明等价于int y[ ][4]={0}; D、只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0 81、以下各组选项中,均能正确定义二维实型数组s的选项是_c___ A、float s[3][4]; B、float s(3,4); float s[ ][4]; float s[ ][ ]={{0};{0}}; float s[3][ ]={{1},{0}}; float s[3][4]; C、 float s[3][4]; D、float s[3][4]; static float s[ ][4]={{0},{0}}; float s[3][ ]; auto float s[ ][4]={{0},{0},{0}}; float s[ ][4]; 82、若有说明语句:int a[ ][3]={1,2,3,4,5,6,7,8}; ,则a数组的行数为__a__ A、3 B、2 C、无确定值 D、1 83、若二维数组y有m列,则在y[i][j]前的元素个数为_B___ A、j*m+i B、i*m+j C、i*m+j-1 D、i*m+j+1 84、下面程序中有错误的行是__D__ 1、 main( ) 2、 { 3、 int x[3]={1}; 4、 int k; 5、 scanf("%d", &x); 6、 for (k=1; k<3; k++) 7、 x[0]=x[0]+x[i]; 8、 printf("x[0]=%d\n", x[0]); 9、 } A、3 B、6 C、7 D、5 85、若有以下语句,则正确的描述是__b__ char x[ ]="12345"; char y[ ]={'1', '2', '3', '4', '5'}; A、x数组与y数组的长度相同 B、x数组长度大于y数组长度 C、x数组长度小于y数组长度

第5章 数组

第 5 章数组 一、选择题 1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( B )。 A. 13 B. 33 C. 18 D. 40 2.有一个二维数组A[1:6,0:7]每个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组的体积是(①L)个字节。假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是(②J)。若按行存储,则A[2,4]的第一个字节的地址是(③C)。若按列存储,则A[5,7]的第一个字节的地址是(④I)。就一般情况而言,当(⑤C)时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。供选择的答案: ①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120 G. 156 H. 234 I. 276 J. 282 K. 283 L. 288 ⑤: A.行与列的上界相同 B.行与列的下界相同 C.行与列的上、下界都相同 D.行的元素个数与列的元素个数相同 3.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( B )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 4.假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( B )。 A. 808 B. 818 C. 1010 D. 1020 5.数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( A )。 A. 1175 B. 1180 C. 1205 D. 1210 6.有一个二维数组A[0:8,1:5],每个数组元素用相邻的4个字节存储,存储器按字节编址,假设存储数组元素A[0,1]的第一个字节的地址是0,存储数组A的最后一个元素的第一个字节的地址是(①H )。若按行存储,则A[3,5]和 A[5,3]的第一个字节的地址是(②C )和(③E )。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址是(④A )和(⑤F )。 ①-⑤:A.28 B.44 C.76 D.92 E.108 F.116 G.132 H.176 I.184 J.188 7.将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A6665(即该元素下标i=66,j=65),在B数组中的位置K为( B )。供选择的答案: A. 198 B. 195 C. 197 8.二维数组A的元素都是6个字符组成的串,行下标i的范围从0到8,列下标j的范圈从1到10。从供选择的答案中选出应填入下列关于数组存储叙述中()内的正确答案。 (1)存放A至少需要( E )个字节; (2)A的第8列和第5行共占( A )个字节; (3)若A按行存放,元素A[8,5]的起始地址与A按列存放时的元素( B )的起始地址一致。 供选择的答案: (1)A. 90 B. 180 C. 240 D. 270 E. 540 (2)A. 108 B. 114 C. 54 D. 60 E. 150 (3)A. A[8,5] B. A[3,10] C. A[5,8] D. A[0,9] 9.二维数组A的每个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。若A按行先存储,元素A[8,5]的起始地址与当A按列先存储时的元素( B )的起始地址相同。设每个字符占一个字节。 A. A[8,5] B. A[3,10] C. A[5,8] D. A[0,9] 10.若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定a ij(i

第4章 指针思考与练习题答案

第4章指针 思考与练习题 1、什么叫内存单元的地址?什么叫指针? 答:在计算机内部的存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址。内存单元的编号,称为内存单元的地址。 在C++语言中,内存单元的地址称为指针。 2、什么叫指针变量?什么叫指针的目标? 答:专门用来存放地址的变量,称为指针变量(pointer variable)。指针指向的内存区域中的数据称为指针的目标。 3、什么叫空指针?其作用是什么? 答:所谓空指针就是指针变量的内容为零的状态。 4、指针运算的实质是什么? 答:指针运算是以指针变量所存放的地址量作为运算量而进行的运算。因此,指针运算的实质就是地址的计算。 5、指针有哪些运算?请枚举这些计算。 答:指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。 6、什么叫数组的指针?什么叫指针数组的指针? 答:在C++语言中,数组的指针是指数组在内存中的起始地址。 指针变量数组和普通的一般变量数组一样,编译系统在处理指针数组说明时,按照指定的存储类型为它在内存中分配一定的连续存储空间,这时指针数组名就表示该指针数组的存储首地址,即指针数组的指针。 7、什么叫二级指针变量?什么叫多级指针变量? 答:对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。我们把一个指向指针变量的指针变量,称为多级指针变量。 8、new运算符的作用是什么?delete运算符的作用是什么? 答:运算符new主要用于分配内存,并获得分配到的内存的首地址,通常需要将其赋给相应数据类型的指针。如果程序中不再需要由new分配的内存空间时,用运算符delete

指针和数组习题

一、1 数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值。() 2. 取数组a的第5个元素的地址,正确的写法是() A) *a[4] B) &a[4]C) a[4] D) *(a+4) 3. 程序段输出结果是() int main() { double number = 12345.12345678; cout << setw(10) << setprecision(5) << number << endl; cout << setw(10) << setprecision(10) << number << endl; return 0; } 12345 B)12345 C) 12345 D) 12345 12345.12346 12345.12345 12345.12345 12345.1235 4、若x为整形变量,p是基类型为整形的指针变量,则正确的赋值表达式() A p=&x B p=x C *p=&x D *p=*x 5,设p1和p2均为指向同一个int型一维数组的指针变量,k为int型变量,下列不正确的语句是() A k=*p1+*p2 B k=*p1*(*p2) C p2=k D p1=p2 6.对于相同类型的指针变量,不能进行()运算。 A,+ B,- C,= D,== 7.有函数定义如下,则其返回值为() int *f(int a) { Int*p,n; n=a; p=&n; return p; } A 一个不可用的存储单元地址值 B一个不可用的存储单元地址值 C n中的值 D 形参a中得值 8,下列关于字符串的描述中,错误的是() A,一维字符数组可以存放一个字符串 B,可以用一个字符串给二维字符数组赋值 C,二维字符数组可以存放多个字符串 D;可以用一个字符串给二维字符数组进行初始化 9;下列关于字符数组的描述中,错误的是() A.字符数组中得每一个元素都是字符 B,字符数组可以使用初始值表进行初始化 C,字符数组可以存放字符串 D 字符数组就是字符串 10;下列关于数组下标的描述中,错误的是() A;C++中,数组元素的下标是从0开始的 B,数组元素下标是一个整型常量表达式

相关文档
最新文档