C语言面试圣经:(结构体内存对齐)---习题

题目一(结构体内存对齐):

计算下面代码的运行结果:

#include<stdio.h>
#include<string.h>
int main()
{
    unsigned char puc[4];
    struct tagPIM
    {
        unsigned char ucPim1;
        unsigned char ucData0 : 1;
        unsigned char ucData1 : 2;
        unsigned char ucData2 : 3;
    }*pstPimData;
    pstPimData = (struct tagPIM*)puc;
    memset(puc, 0, 4);
    pstPimData->ucPim1 = 2;
    pstPimData->ucData0 = 3;
    pstPimData->ucData1 = 4;
    pstPimData->ucData2 = 5;
    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
    return 0;
}

答案是02 29 00 00 

题目二

编程题:变种水仙花数

//变种水仙花数
#include<stdio.h>

int main(void)
{
	for (int i = 10000; i < 99999; i++)
	{
		//i=12345;
		int sum = 0;
		for (int j = 10; j <= 10000; j *= 10)
		{
			sum += (i / j) * (i % j);
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

 

题目三

编程题:第一行 输入一个N整数;

第二行 输入N个值(0<N<50);

第三行  删除一个值del

实例:第一行 输入一个值:6
           第二行 输入N个值:1 2 3 4 5 9
           第三行 删除4

最后打印出来的是 1 2 3 5 9

#include<stdio.h>

int main(void)
{
	int n = 0;
	scanf("%d", &n);//输入一个整数N
	int arr[50] = { 0 };
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);//取出N个整数/
	}
	int del;//输入想要删除的一个整数
	scanf("%d", &del);//取地址要删除的整数
	int i = 0;
	int j = 0;
	for (; i < n; i++)
	{
		if (arr[i] != del)
		{
			arr[j] = arr[i];
			j++;
		}
	}
	for (int k = 0; k < j; k++)//打印出数组arr[k],新的数组,删掉一个整数之后的数组
	{
		printf("%d ", arr[k]);
	}
}

 

题目四 

使用结合体的知识,判断一个机器是大端存储还是小端存储,如果是小端返回1,大端返回0.

#include<stdio.h>

int check_yes()
{
	union un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}
int main(void)
{
	int ret = check_yes();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
		printf("大端\n");
	return 0;
}

题目五:

计算下面代码的运行结果:

#include<stdio.h>
int main()
{
    union
    {
        short k;
        char i[2];
    }*s, a;
    s = &a;
    s->i[0] = 0x39;
    s->i[1] = 0x38;
    printf("%x\n", a.k);
    return 0;
}

运行结果是3839 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值