c++作业整理2
-
直接访问就是直接利用变量的地址直接进行访问。
答案:T
解析:直接访问通过变量名(实际对应内存地址)访问数据,与间接访问(通过指针)相对。 -
char *s="C Language"; 表示 s 是一个指向字符串的指针变量,把字符串的首地址赋予 s。**
答案:T
解析:字符串常量存储在静态区,s
指向其首地址。 -
执行语句 int *p = 1000; 后,指针变量 p 指向地址为 1000 的变量。**
答案:F
解析:直接赋值整数需强制类型转换(如(int*)1000
),且可能导致非法访问。 -
语句 int *p; *p = 50; 执行时,不会有任何错误。**
答案:F
解析:p
未初始化,解引用会导致野指针错误。 -
字符串常量实质上是一个指向该字符串首字符的指针常量。
答案:T
解析:字符串常量可视为指向首字符的常量指针。 -
对于定义 int a [5],p=a; 后,(p+1) 和(a+1) 的值是相同的。**
答案:T
解析:a
是地址常量,但允许读取和运算,a
的不可修改性:-
a
是编译时确定的地址常量,不能重新赋值(如a = &x
非法)。 -
但可以读取
a
的值并进行运算(如a + 1
)。
-
-
If variables are defined and assigned correctly, the expression ______ is wrong.
答案:C. &&x
解析:&&
是逻辑与运算符,需要两个操作数,单独使用&&x
是错误的。 -
根据声明
int p[5], *a[5];
,表达式 ______ 是正确的。
**答案:C. *(a+1)=p**
解析:a
是指针数组,*(a+1)
即a[1]
(类型int*
),p
是int*
,赋值合法。 -
表达式
分解步骤*p->str++
的正确描述是 __。
运算符优先级与结合顺序:->
(成员访问)优先级高于++
(后缀)和*
(解引用)。表达式*p->str++
等价于*( (p->str)++ )
。-
*
:解引用递增前的str
值,得到字符'a'
。 -
str++
:后缀递增作用于str
指针本身。 -
返回
str
的原始值(指向'a'
),然后str
自增,指向'b'
。 -
p->str
:访问结构体指针p
指向的成员str
,即字符指针a.str
(指向字符串"abc"
的首字符'a'
)。
-
-
For definitions:
char s[2][3]={"ab", "cd"}, *p=(char *)s;
the expression __ is correct and its value is equivalent to the elements[1][1]
.A.*(s+3) B.*s+2 C.p[1][1] D.*++p+2
A 选项:s
是二维数组名,s+3
会超出数组范围,导致未定义行为,所以 A 选项错误。
B 选项:*s
等价于s[0]
,是一个指向字符数组的指针,*s + 2
会指向s[0][2]
,而不是s[1][1]
,所以 B 选项错误。
C 选项:p
被强制转换为指向字符的指针,p[1][1]
会访问到s
数组之外的内存,导致未定义行为,所以 C 选项错误。
D 选项:p
指向s
数组的首元素,++p
会使p
指向s[0][1]
,*++p
会获取到字符b
,*++p + 2
会得到字符d
,即s[1][1]
,所以 D 选项正确。*++p + 2
将字符'b'
的 ASCII 码值98
加 2,得到100
。100
对应字符'd'
(ASCII 码表中,'b' + 2 = 'd'
)。这种相等是基于字符编码的巧合,并非指针直接访问到了s[1][1]
的内存位置。实际上,p
此时仍指向s[0][1]
,但表达式通过计算字符值得到了相同的结果。 -
For the function declaration
void f(char ** p)
,the definition __ ofvar
makes the function callf(var)
incorrect。A.
char var[10][10];
B.
char *var[10];
C.
void *var = NULL;
D.
B.char *v=NULL, **var=&v;
选项分析
A.char var[10][10];
类型不匹配:char(*)[10]
与char**
不兼容,导致编译错误。数组名var
退化为 指向一维数组的指针(char(*)[10]
),而非char**
。var
是二维字符数组,类型为char[10][10]
。char *var[10];
数组名var
退化为char**
,与函数参数类型一致,合法。var
是字符指针数组,类型为char*[10]
。
C.void *var = NULL;
void*
可隐式转换为任意指针类型,包括char**
,语法合法(可能有警告,但无错误)。
D.char *v=NULL, **var=&v;
var
是char**
,直接匹配参数类型,合法。
写一程序,若干个字符串(待排序的字符串个数不会超过100个,每个字符串长度不超过20个字符),按字典序对这些字符串进行排序并输出。
输入格式:
若干行,每行一个只包含大小写字母的字符串,为待排序字符串,这些字符串的最后一个字符串为“end”。
输出格式:
每行一个字符串,按字典序输出,字符串end不输出。
#include<bits/stdc++.h>
using namespace std;int main()
{priority_queue<string,vector<string>,greater<string>>pq;string zf;cin>>zf;while(zf!="end"){pq.push(zf);cin>>zf;}while(!pq.empty()){cout<<pq.top()<<endl;pq.pop();}return 0;
}
稷下英才实验班有个同学叫虎子,有一天虎子刷到了一道编程题:给M(M<=100)组数据,每组数据有N个正整数(N<=100),要求把每组的N个数按升序排成一行。虎子觉得应该用指针和函数实现比较高效,但总是调试不出来,你能帮帮他吗?
输入格式:
输入包括M+1行,第一行是两个正整数M、N;M表示总共多少组数据,下面M行每行包含N个正整数。(输入数据之间会用空格隔开)
输出格式:
输出包括M行,每行分别对应输入中M组数据的升序序列,数与数之间用一个空格隔开。
#include<bits/stdc++.h>
using namespace std;int main()
{int m,n;cin>>m>>n;while(m--){int a[n];for(int i=0;i<n;i++){cin>>a[i];}sort(a,a+n);for(int i=0;i<n;i++){cout<<a[i];if(i<n-1)cout<<" ";}if(m>=1)cout<<endl;}return 0;
}