1. 以下对一维数组a的定义正确的是( )。 A.int n = 5, a[n]; B.int a(5); C.const int N = 5; int a[N]; D.int n; cin>>n; int a[n]; 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
2. 下列数组定义语句中,不正确的是( )。 A.int a[3] = { 0, 1, 2, 3 }; B.int a[] = { 0, 1, 2 }; C.int a[3] = { 0, 1, 2 }; D.int a[3] = { 0 }; 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
3. 已知int a[6]= { 0, 1, 2, 3, 4, 5}, *p = a;,不能表示数组a中元素的表达式是( )。 A.*a B.*p C.a D.a [p-a] 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
4. 已知int a[] = { 0,2,4,6,8,10 }, *p = a+1; 其值等于 0 的表达式是( )。 A.*(p++) B.*(++p) C.*(p--) D.*(--p) 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
5. 以下不能对二维数组a进行正确初始化的语句是( )。 A.int a[2][3] = { 0 }; B.int a[][3] = { { 0,1 }, { 0 } }; C.int a[2][3] = { { 0, 1 }, { 2, 3 }, { 4, 5 } }; D.int a[][3] = { 0, 1, 2, 3, 4, 5 }; 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
6. 已知int a[][3] = { { 0, 1 }, { 2, 3, 4 }, { 5, 6 }, { 7 } }; ,则 a[2][1]的值是( )。 A.0 B.2 C.6 D.7 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
7. 已知int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };,不能表示数组元素a[2][1]的地址是( )。 A.&a[2][1] B.*(a[2]+1) C.a[2]+1 D.*(a+2)+1 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
8.
答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
9. 若用数组名作为调用函数的实参,则传递给形参的是( )。 A.数组存储首地址 B.数组的第一个元素值 C.数组中全部元素的值 D.数组元素的个数 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
10. 设有char* s1=ABCDE, s2=ABCDE, s3=s1;,下列表达式中值等于 true的是( )。 A.strcmp(s1,s2) B.strcmp(s1,s3)==1 C.strcmp(s2,s3)==-1 D.strcmp(s1,s3) ==0 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
11. 设 char s1, s2;分别指向两个字符串,可以判断字符串s1和s2是否相等的表达式为( )。 A.s1=s2 B.strlen(s1,s2) C.strcpy(s1,s2)==0 D.strcmp(s1,s2)==0 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
12. 设 char s1, s2;分别指向两个字符串,可以判断字符串s1是否大于字符串s2的表达式为( )。 A.strcmp(s1,s2)<0 B.strcmp(s1,s2)==0 C.strcmp(s1,s2)>0 D.strcmp(s2,s1)>0 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
13. 有数组定义double d[10];,以下叙述不正确的是( )。 A.数组d有10个元素 B.数组d的最后一个元素是d[10] C.数组d的第一个元素是*d D.数组d的字节数是sizeof(double)*10 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
14. 以下建立动态存储的语句正确的是( )。 A.int p=new int; B.int p =new(10); C.int *p(10); D.int *p=new int(10); 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
15. 假设int *p=new int[10];,则释放动态数组的正确语句是( )。 A.delete []p; B.delete p[]; C.delete int[]p; D.delete p int[10]; 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
16. 假设int *p=new int[10];,则访问动态数组元素的正确语句是( )。 A.int a=p; B.int a=&p; C.int *a=p[1]; D.int a=p[1]; 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
17. 下列代码的执行结果是( )。 char *s="ABCDE"; cout<<*(s+1)<<endl; A.A B.B C.ABCDE D.BCDE 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
18. 下列代码的执行结果是( )。 char *s="ABCDE"; cout<<(s+1)<<endl; A.A B.B C.ABCDE D.BCDE 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
19. 下列代码的执行结果是( )。 char *s="ABCDE"; cout<<strlen(s)<<endl; A.6 B.5 C.4 D.1 答题: A. B. C. D. (已提交) -->参考答案:B 问题解析: |
20. 以下对字符数组进行初始化的语句正确的是( )。 A.char a[] = “hello”; B.char a[][] = {‘h’,’e’,’l’,’l’,’o’}; C.char a[5] = “hello”; D.char a[2][5] = {“hello”,”world”}; 答题: A. B. C. D. (已提交) -->参考答案:A 问题解析: |
21. 在C++语言中,引用数组元素时,数组下标的数据类型允许是( )。 A.整型常量 B.整型表达式 C.整型常量或整型表达式 D.任何类型的表达式; 答题: A. B. C. D. (已提交) -->参考答案:C 问题解析: |
22. 已知int a[10];,下列语句能正确对数组a的元素进行引用的是( )。 A.a[10] B.a[3.5] C.a(5) D.a[10-10] 答题: A. B. C. D. (已提交) -->参考答案:D 问题解析: |
思考题
1.数组说明语句要向编译器提供什么信息?请写出一维数组、二维数组说明语句的形式。
【解答】
数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组维数、数组长度(元素的个数)等信息。
一维数组说明语句为: 类型 数组名[表达式]
二维数组说明语句为: 类型 数组名[表达式1] [表达式2]
2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式。若有说明
int aa [3], *pa=aa;
请使用aa或pa,写出3个以上与aa[2] 等价的表达式。
【解答】
数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量。
对一维数组aa第i个元素的地址可以表示为: &aa[i] aa+i;
对一维数组aa第i个元素的值可以表示为: a[i] *(a+i);
与aa[2]等价的表达式:
*(aa+2) *(&a[2]) *(pa+2) pa[2]
3.要把一维数组 int a[m*n] 的元素传送到二维数组 int b[m][n] 中,即在程序中要执行
b[i][j]=a[k];
请写出kài,j的下标变换公式,并用程序验证。
【解答】
转换公式: i=k/n j=k%n
验证程序:
#include <iostream>
using namespace std;
int main()
{ const int M=3,N=4;
int k,a[M*N]={1,2,3,4,5,6,7,8,9,10,11,12},b[M][N];
int i,j;
cout<<"array a:"<<endl;
for( k=0; k<M*N; k++ )
b[k/N][k%N] = a[k];
for( k=0; k<M*N; k++ )
cout<<a[k]<<'\t';
cout<<endl;
cout<<"**After convert**"<<endl;
cout<<"array b:"<<endl;
for(i=0;i<M;i++)
{ for(j=0;j<N;j++) cout<<b[i][j]<<'\t';
cout<<endl;
}
}
4.有以下函数
void query()
{ int *p;
p=new int[3];
//……
delete []p;
p=new double[5];
//……
delete []p;
}
出现了编译错误。请分析错误的原因,并把上述程序补充完整,上机验证你的判断。
【解答】
在语句p=new double[5]; 中企图把动态浮点型数组的地址写入整型指针p,造成错误。错误为error C2440: “=”: 无法从“double *”转换为“int *”。
改正方法:增加一个double*q指针。
void query()
{ int *p;
p=new int[3];
delete [] p;
//……
double *q;
q=new double[5];
//……
delete []q;
}
5.有以下程序根据输入值,设计功能是调用函数create建立并初始化动态数组,令a[i]=i。但该程序运行后不能得到期望结果,请分析程序的错误原因并修改之。
#include <iostream>
using namespace std;
void create(int *, int);
int main()
{ int *a = NULL, len;
cin>>len;
create(a,len);
for( int i = 0; i<len; i++ )
cout << a[i] << " ";
cout << endl;
delete []a;
a = NULL ;
}
void create(int *ap, int n)
{ ap=new int[n];
for(int i=0; i<n; i++) ap[i]=i;
}
【解答】
函数create中,指针参数int*ap是传地址值的参数。调用函数时接受实际参数a的值(地址值)作为初始值。ap仅是局部变量,ap=new int[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数a无关。程序没有编译错误,但main不能获得动态数组。修改方法是把ap改为指针引用参数。
void create(int *&,int); //函数原型声明,使用引用参数
void create(int *&ap,int n) //函数定义
{ ap=new int[n];
for(int i=0;i<n;i++)
ap[i]=i;
}
|