C/C++笔试题汇总 01

目录

1. (void *)ptr和(*(void **))ptr的结果是否相同? 其中ptr为同一个指针(中等题)

2. 要对绝对地址0x100000赋值,我们可以用(unsigned int *)0x100000=1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?(中等题)

3. 给定结构体,问sizeof(struct A)是多少?(基础题)

4.这个程序会出现什么问题?(中等题)

5. 编写函数void hton(float val,char *buf)把小端序的val转换成大端序的val,存放到buf中  

6. 写出int,bool,float,指针变量与“零值”比较的if语句(基础题)

7.请指出如下语句的含义(基础题)

8. 现有1M长度的char数组,请将每个字节进行高低位互换(一个字节的八位二进制逆序),如果我们需要频繁地处理这样的数据,请实现一个高效的处理函数(中等题)

*9. 用DrawPixel(x,y)画点函数实现一个void DrawLine(int x1,int y1,int x2,int y2)划线函数.

10. 如下程序有什么问题,请指出(基础题)

*11. 请你定义如下几种函数,函数没有形参,但是有返回值类型,返回值类型(只要类型符合要求就行)要求如下(基础题)

12. const char *a; const char *a; char *const a;   有什么不同(基础题)

13. 以下程序的输出结果为?(基础题)

14.分析如下写法的含义(基础题)

15.写出以下程序执行结果(基础题)

16.写出以下程序执行结果(基础题)

17.写出以下程序执行结果(基础题)

18.写出以下程序执行结果(基础题)

19.数独游戏是在9×9的方格内进行,用1至9之间的数字填满空格,一个格子填入一个数字,使其满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。请设计算法,用程序来完成数独游戏,写明思路即可,不要求写代码。(中等题)

20.试写一个函数,计算字符串 s中最大连续相同的字符个数。例如,若s 为"aaabbbb",则返回值为4;若s为"abcde",则返回值为1。(基础题)


1. (void *)ptr和(*(void **))ptr的结果是否相同? 其中ptr为同一个指针(中等题)

2. 要对绝对地址0x100000赋值,我们可以用(unsigned int *)0x100000=1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?(中等题)

错误写法:void(*(0x100000))()();

正确写法1:先将地址强制转换为函数指针,再调用即可

 ((void (*)())0x100000)();

正确写法2:用typedef定义一个函数指针类型,更加直观

typedef void (*funcptr)();

((funcptr)0x100000)();

3. 给定结构体,问sizeof(struct A)是多少?(基础题)

struct A
{
    char t:4;
    char k:4;
    unsigned short i:8;
    unsigned long m;
}; 

关键点::4表示位域长度,即比如说t要强行占用4个bit

那么就是4bit+4bit+8bit+4byte并且保证是最大字节的倍数,所以不是6字节而是8字节

4.这个程序会出现什么问题?(中等题)

void getmemory(char *p)
{
    p = (char *)malloc(100);
    strcpy(p,“hello world”);
}

int main()
{
    char *str = NULL;
    getmemory(str);
    printf(“% s / n”, str);
    free(str);
    return 0;
}

程序访问了非法内存,会发生段错误,并且还造成了内存泄露。

原因是calloc并没有把堆内存交给str,仅仅只是改变了局部变量p指向的地址(一开始指向str指向的内存),所以函数退出后str仍然指向NULL自然不可以访问。另外getmemory函数申请的堆内存也没有被释放,于是造成了内存泄露。

5. 编写函数void hton(float val,char *buf)把小端序的val转换成大端序的val,存放到buf中   

union endian
{
    char arr[4];
    float f;
} big;

void hton(float val, char *buf)
{
    big.f = val;

    char temp;
    temp = big.arr[0];
    big.arr[0] = big.arr[3];
    big.arr[3] = temp;

    temp = big.arr[1];
    big.arr[1] = big.arr[2];
    big.arr[2] = temp;

    strcpy(buf, big.arr);
}

用于查验以上方法是否正确的代码

// 将单精度浮点数用16进制的形式打印出来
void printfloat_16(const float fnum)
{
    uint8_t* c = (uint8_t*)&fnum;
    printf("0x");
    for (int i = 3; i >= 0; --i)
        printf(" %02x", c[i]);
    printf("\n");
}

// 将16进制形式的数以浮点数的形式打印出来
union int2float
{
    int num1;
    float num2;
};

void main()
{
    // 转换出来的浮点数与实际可能会有误差
    union int2float num;
    num.num1 = 0xc2087ae1;
    printf("%f\n", num.num2);
}

void printfloat_16(const float fnum)函数的参考链接:

https://blog.csdn.net/qq_45512097/article/details/124458205

6. 写出int,bool,float,指针变量与“零值”比较的if语句(基础题)

#define PRECISION 0.0000001
int main()
{

    int n;

    if (n == 0);

    if (n != 0);


    bool flag;

    if (flag);

    if (!flag);


    float f;

    if (f > -PRECISION && f < PRECISION);

   
    char *p;

    if (p == NULL);

    if (p != NULL);

}

       浮点数在内存中的存贮机制和整型数不同,有舍入误差,在计算机中用以近似表示任意某个实数。

        具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。 所以浮点数在运算过成功运算通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。 

7.请指出如下语句的含义(基础题)

(1) void *(*(p1)(int))[10];

(2) float (*(*p2)(int,int,float))(int);

(3) typedef double (*(*(*p3)())[10])();

(4) int (*(*p4())[10])();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值