文章目录
- 选择题
- 7.
- 编程题
- 1.
- 2.
选择题
(6)因为p2被const修饰所以p2不可以被改变,但是p2的指向可以被改变
(7)因为指针p3被const修饰,所以p3的指向不能被改变,但是*p3可以被改变
int main()
{int a = 10;int b = 5;const int* p1 = &a;int* const p2 = &a;p1 = &b;cout << "*p1:" << *p1 << endl;//*p1 = 8;//不能修改//p2 = &b;//不能修改*p2 = 8;cout << "*p2:" << " " << *p2 << endl;cout << "a:" << " " << a << endl;return 0;
}
常量指针和指针常量的区别:
常量指针,指针所指空间的值不能发生改变,不能通过指针解引用修改指针所指空间的值,但指针所指空间可以发生改变
常量指针,该指针是一个常量,可以通过解引用改变指针所指空间的值,但是指针的指向不能发生改变
3.
A:acx和acy都是字符数组,是在栈上开辟的空间,内容可以被修改
B:szx和szy都是指针字符串,在常量区开辟的空间,且字符串相同,因此他们指向同一块空间
C:acx是字符串初始化字符数组,字符串结尾默认有一个\0,因此acx占用空间比acy大
D:szx内容修改实际是指针的指向发生了改变,字符串常量本身并不会被修改
5.
A:宏定义是没有类型安全检测的
B:因为宏定义是在编译阶段进行傻瓜式的替换的,不能被调试,因此我们要尽量使用const常量,而避免使用宏定义
D:相对于函数调用,宏定义可以提高程序的运行效率,宏定义没有创建函数栈帧和函数压栈的开销
7.
A: 存放的是10个int类型的指针的数组,指针数组
B:一个指针指向的是大小为10的int类型的数组,数组指针,因为[ ]优先级高于所以这里添加了()
C:指向一个参数为一个int类型的函数指针
D:是有10个指向参数为一个int类型的指针数组
注意区分:
指针数组和数组指针:
指针数组: int p[10],本质是一个数组,数组里面存放的是指针
数组指针:
int (p)[10],本质是一个指针,指针指向的是一个数组
int (p[10])[5],p是一个数组,数组中存放的类型是int ( * )[5]
判断类型的方法:去掉第一个和p结合的,产生的是p的类型,而剩下的是指向的类型
例如:
int p的含义是p先和结合说明p是一个指针,剩下的是int,所以p是一个指向int类型的指针
int (p)[10]:p先和结合说明p是一个指针,指向的是一个含有10个int类型的数组int [10]
数组指针和函数指针
数组指针:int (*p)[10]
函数指针:int (*p)(int, int)
9.
这题主要考察的是位段:
什么是位段,位段的作用是做什么?
位段的作用是用来减少空间开辟的
结构体内如果类型为int,unsigned int或char类型就可采用位段来进行存储
位段的定义:类型后面定义变量,变量后面加冒号:,冒号后面加上该类型存放所需要的比特位,注意这里最后的结果也要进行内存对齐。具体请查看博客文章C语言三万字总结
10.
int main()
{int a[4] = { 1,2,3,4 };cout << &a << endl;cout << &a + 1 << endl;cout << &a[0] << endl;cout << &a[0] + 1 << endl;cout << endl;int b[][3] = { 1,2,3,4,5,6 };cout << &b << endl;cout << &b + 1 << endl;cout << &b[0] << endl;cout << &b[0] + 1 << endl;return 0;
}
&a + 1加的是整个数组的大小
对于一维数组&a[0] + 1加的是一个元素的大小
对于二维数组&a[0] + 1加的是一行数组的大小
编程题
1.
思路:先让字符串整体逆序,再对每个单词进行逆序
#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {string s;getline(cin, s);//先整体逆置reverse(s.begin(), s.end());//再对每个单词进行逆置auto begin = s.begin();auto end = s.begin();while(begin != s.end()){while(*end != ' ' && end != s.end()){++end;}reverse(begin, end);//如果end = s.end(),就不能让begin = end + 1了,加了的话会出现越界if(end != s.end()){begin = end + 1;end = begin;}else {begin = end;}}cout << s << endl;return 0;
}
// 64 位输出请用 printf("%lld")
2.
理解题意:本题意思就是这个无序序列,在不被改动的情况下,最少可以被分为几个非递增或非递减序列,比如1,2,2,3,2,3,3,1就可以被分为1,2,2,3,和2,3与1这三个序列
#include <iostream>
#include <vector>using namespace std;int main() {int n = 0;cin >> n;vector<int> v(n, 0);for (int i = 0; i < n; i++) {cin >> v[i];}int count = 0;int j = 0;while(j < n){if(j + 1 == n){count ++;break;}if (v[j] < v[j + 1]) {while (j < n && v[j] <= v[j + 1]) {j++;}j++;count++;} else if (v[j] > v[j + 1]) {while (j < n && v[j] >= v[j + 1]) {j++;}j++;count++;} else {j++;}}cout << count << endl;return 0;}
// 64 位输出请用 printf("%lld")