目录
1. (void *)ptr和(*(void **))ptr的结果是否相同? 其中ptr为同一个指针(中等题)
2. 要对绝对地址0x100000赋值,我们可以用(unsigned int *)0x100000=1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?(中等题)
3. 给定结构体,问sizeof(struct A)是多少?(基础题)
5. 编写函数void hton(float val,char *buf)把小端序的val转换成大端序的val,存放到buf中
6. 写出int,bool,float,指针变量与“零值”比较的if语句(基础题)
8. 现有1M长度的char数组,请将每个字节进行高低位互换(一个字节的八位二进制逆序),如果我们需要频繁地处理这样的数据,请实现一个高效的处理函数(中等题)
*9. 用DrawPixel(x,y)画点函数实现一个void DrawLine(int x1,int y1,int x2,int y2)划线函数.
*11. 请你定义如下几种函数,函数没有形参,但是有返回值类型,返回值类型(只要类型符合要求就行)要求如下(基础题)
12. const char *a; const char *a; char *const a; 有什么不同(基础题)
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])();