1.若下列程序的运行结果是6 3,fun函函数调用时的实参(题中?)应该为:
void fun(int &a, int &b){ //用的谁的引用,改变谁的值。
int k;
k=a; a=b; b=k;
}
int main(){
int a=3,b=6,*x=&a,*y=&b;
fun(?);
cout<<a<<" "<<b;//这里改变了ab的值,实参应该是ab.
}
A【正确答案: A】
A a,b
B &a,&b
C x,y
D *x,*y
//指针的引用就是用来改变指针的值(指针的指向)。
2.已知函数func 的原形是
double func(double *pd,int &ri);
变量x 和y 的定义是double x;int y;把x 和y 分别作为第一参数和第二参数来调用函数func,正确的调用语句是:
B【正确答案: B】
A func(x,&y);
B func(&x,y);
C func(&x,&y);
D func(x,y);
//引用的实参是本身,不是地址。
3.以下定义语句中正确的是:C【正确答案: C】
A char a='A’b=‘B’;
B float a=b=10.0; //不能连续赋。
C int a=10,*b=&a;
D float *a,b=&a;
4.以下程序段运行后,a的值是:
int a,k=4,m=6,*p1=&k,*p2=&m;
a=p1==p2;
cout<<a<<endl;
#include <iostream>
using namespace std;
int main() {
int a,k=4,m=6,*p1=&k,*p2=&m;
a=p1==p2;
cout<<p1<<endl; //0x6ffe08 p1的位置高。
cout<<p2<<endl; //0x6ffe04 p2的位置低。
cout<<p1-p2<<endl; //1 相差一个元素。
cout<<p2-p1<<endl; //-1
cout<<(p1==p2)<<endl; //0
cout<<(p1<p2)<<endl; //0
cout<<(p1>p2)<<endl; //1
//p1大于p2是真,而且真的大一。
cout<<a<<endl; //0
return 0;
}
D【正确答案: C】
A 4
B 1
C 0
D 运行时出错,a无定值
CD豪_Dwight的博客:
指针变量是有加减运算的,但是要注意以下几点:
-
指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x2000 0000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址。指针变量可以加减,但是只能与整型数据加减,此时加减的含义并不是其地址值进行了加减,也就是说如果指针变量p的值是0x20000000,那么p=p+2;的值并不是0x2000 0002,并不是地址值的简单相加减,那么地址值加减多少是与指针指向的数据类型相关联的:如果在64位的操作系统上,p是指向整型数据的指针变量,那么p=p+2之后,p的存储的地址值变成0x2000 0008;同理,如果在32位的操作系统上,p是指向整型数据的指针变量,那么p=p+2之后,p的存储的地址值变成0x20000008,也就说实际上地址值加了sizeof(int)*2这么多。说明白点,我们加减的数字是以指针指向的数据类型为量度的,p+2表示p在内存中前移两个int的距离,如果p不是int类型,而是其他类型道理也是一样。同样指针与整型数据相减也是同样的道理。
-
指针之间可以相减,但不可以相加:两个同一类型的指针变量是可以相减的,他们的意义表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数),例如对于int类型的指针p和p1.p1-p的意义表示他们之间相隔多少个int类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。指针变量的自加和自减实际上是与整数1的加减运算。
-
指针之间可以比较大小。但是同样也限于两个相同类型的指针变量,不同类型的指针变量之间比较大小没有任何意义。指针之间的大小比较的意义,表示在内存中他们指向的位置的高低关系。
栈的地址是由高端地址向低端增长
5.下列程序段的输出结果是:
D【正确答案: D】
int *p, *q, k = 1, j=10 ;
p = &j;
q = &k ;
p = q ;
(*p)++; //先取值,再自加,改变指针指向的元素的值。
cout<<j<<k<<endl;
A 111
B 101
C 112
D 102
6.下列程序段的输出结果是:
void fun(int *x, int *y{
cout<<*x<<*y;
*x=3; *y=4;
}
int main(){
int x=1,y=2;
fun(&y,&x); //21
cout<<x<<y<<endl;//43.
return 0;
}
A【正确答案: A】
A 2 1 4 3
B 1 2 1 2
C 1 2 3 4
D 2 1 1 2
7.下列程序的运行结果是:
void fun(int *a, int *b){
int *k;
k=a; a=b; b=k; //改变不了。
}
int main(){
int a=3,b=6,*x=&a,*y=&b;
fun(x,y);
cout<<a<<" "<<b;
}
B【正确答案: B】
A 6 3
B 3 6
C 编译出错
D 0 0
1.下面是对s的初始化,其中不正确的是:
D【正确答案: D】
A char s[5]={“abc”};
B char s[5]={‘a’,‘b’,‘c’};
C char s[5]="";
D char s[5]=“abcde”; //太长了。
2.已知: char str[]=“ab\n\012\”";则执行语句:cout<<strlen(str);的结果是:
C【正确答案: C】
A 3
B 4
C 6
D 12
//‘a’,‘b’,’\n’,’\012’,’\’,’"’.共六个。
3.调用strlen(”abcd\0ef\0g”)的返回值是:A【正确答案: A】
A 4
B 5
C 8
D 9
//strlen测字符串长度而不是在内存中的大小,从第一个字符开始,遇到’\0’结束,所以只测了’a’,‘b’,‘c’,'d’四个字符串的长度。
4.下面程序段的运行结果是:
char c[5]={'a','b','\0','c','\0'};
cout<<c<<endl;
B【正确答案: B】
A ‘a’‘b’
B ab //输出遇到’\0’结束。
C ab c
D ab▄(▄表示空格)
5.若有以下语句,则正确的描述是:
char x[]=”12345”;
char y[]={’1’,’2’,’3’,’4’,’5’};
A【正确答案: B】
A x数组和y数组的长度相同
B x数组长度大于y数组的长度 //数组x的字符串在内存中存储的时候,末尾会自动加’\0’,而数组y不会,所以是大于。
C x数组长度小于y数组的长度
D x数组等价于y数组
6.已知:char str1[20]=“abcde”,str2[20]=“xyz”;则执行语句: cout<<strlen(strcpy(str1,str2));输出结果是:B【正确答案: B】
A 9
B 3 //strlen()测字符串长度而不是内存大小。复制就是前面的内容没了。
C 5
D 8
7.有已排好序的字符串a,下面的程序是将字符串s中的每个字符按升序的规律插入到a中。请选择填空。
char a[20] = "cehiknqtw";
char s[] = "fblaz";
int i, k, j;
for (k = 0; s[k] != '\0'; k++) {
j = 0;
while (a[j] != '\0' && s[k] >= a[j])
j++; //一直加到s[k]<a[j]
for (i = strlen(a); i >= j; i--) { //i是字符串的长度,a[i]表示字符串末尾的'\0';'\0'也要跟着向后移动,不能把'\0'的位置占了。
( 请填空 );
}
a[j] = s[k]; //s[k]到a[j]的位置。则说明a[j]开始直到最后一个字符都往后移。
}
puts(a);
B【正确答案: B】
A a[i]=a[i+1]
B a[i+1]=a[i]
C a[i]=a[i-1]
D a[i-1]=a[i]
8.下列程序的执行结果是: 1225 【 正确答案: 12】
#include<iostream>
using namespace std;
int main() {
char ch[] = { "12ye25ri" };
int i, s = 0;
for (i = 0; ch[i] >= '0' && ch[i] <= '9'; i++) //条件是ch[i] >= '0' && ch[i] <= '9',一旦不满足,循环就结束。跟这条件在while里不一样。
s = 10 * s + ch[i] - '0';
cout << s << endl ;
return 0;
}