C++笔试训练day_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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想很美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值