-
直接访问就是直接利用变量的地址直接进行访问。
答案: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 __ ofvarmakes 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;
}
