一些c语言面试题整理,包含了很多面试内容
目录
C语言面试题.......................................................................................................................................1
第一部分:基本概念及其它问答.........................................................................................................2
第二部分:程序代码评价或者找错.....................................................................................................4
第三部分:编程题.................................................................................................................................24
第四部分:附加部分.............................................................................................................................27
【计算机硬件与性能优化】基于NEON技术的矩阵运算优化:不同CPU架构下的效果分析及多线程应用策略
内容概要:本文档探讨了不同CPU架构下使用ARM Neon技术对矩阵运算进行优化的效果。首先介绍了常规矩阵乘法代码和使用Neon指令集优化后的矩阵乘法代码,展示了如何利用SIMD(单指令多数据流)技术加速矩阵计算。接着通过实验对比了Cortex-A78AE、Cortex-A57、Cortex-A53和Cortex-A55四款CPU在执行16阶矩阵10000次乘法运算时的基本性能与Neon优化后性能的巨大差异,结果显示Neon优化能显著降低计算时间。最后总结了ARM Neon的特点及其在多线程环境下的应用注意事项,强调了合理分配NEON资源的重要性,以及确保线程安全性的必要措施。
适合人群:对嵌入式系统开发感兴趣,特别是关注ARM架构下高性能计算优化的技术人员。
使用场景及目标:①理解ARM Neon指令集的工作原理及其对矩阵运算性能的影响;②掌握在ARM平台上利用Neon技术优化程序性能的方法;③学习如何在多线程环境中正确使用Neon指令集以避免数据竞争问题。
其他说明:文档提供了具体的代码示例,帮助读者直观地了解Neon优化前后的区别。同时提醒开发者注意NEON寄存器的使用规则,尤其是在多核处理器上进行并行计算时,要充分考虑线程间的资源共享和同步问题。
ioctl函数的使用已经自动创建设备节点
## 【1】ioctl函数的使用
```c
ioctl:设备的控制
read/write:数据的读写
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
功能:设置的控制
参数:
@fd:文件描述符
@request:
====== ==================================
bits meaning
====== ==================================
31-30 :2bit方向(用户的输入或输出)
00 - no parameters: uses _IO macro
10 - read: _IOR
01 - write: _IOW
11 - read/write: _IOWR
29-16 :14bit (第三个参数的大小)
size of arguments
15-8 :8bit (类型,用一个字符的ascii表示这个驱动)
ascii character supposedly
unique to each driver
7-0 :8bit (功能)
function #
====== ==================================
驱动io模型相关笔记,阻塞io和非阻塞io
## 【1】IO模型
1.非阻塞
2.阻塞
3.IO多路复用(epoll)
4.异步通知
## 【2】非阻塞IO模型
```c
user:
open("/dev/mycdev0",O_RDWR|O_NONBLOCK) //O_NONBLOCK非阻塞
read(fd,buf,sizeof(buf));
----------------------------------------------------
kernel:
ssize_t mycdev_read(struct file *file,
char __user *ubuf, size_t size, loff_t *offs)
{
if(file->f_flags & O_NONBLOCK){
//从底层硬件中读取数据
//将数据拷贝到用户空间即可
}
}
```
## 【3】阻塞IO模型
```c
阻塞IO模型:应用层以阻塞的方式来访问设备文件,如果硬件的数据没有准备好,
此时进程进入休眠状态,如果设备中的数据准备好了,会产生一个硬件中断。
在中断处理函数唤醒休眠的进程,驱动将硬件数据读取到内核空间,然后再
将数据返回到用户空间。
user:
open("/dev/mycdev0",O_RDWR) //阻塞
read(fd,buf,sizeof(buf)); //如果数据没有准备好要阻塞(进程要休眠)
-------------------------------------------------------------------
kernel:
ssize_t mycdev_read(struct file *f
【C语言编程】指针与数组关系解析:一维数组、二维数组及数组指针的操作方法综述
内容概要:本文档详细介绍了C语言中指针和数组的相关概念及其相互关系。首先讲解了一维数组的基本定义与地址运算规则,包括数组首地址的概念及其偏移计算方法。接着阐述了指针与一维数组之间的联系,通过具体实例展示了如何用指针来访问数组元素。随后深入探讨了二维数组的定义、访问方式以及地址运算,强调了不同维度下地址偏移的区别。最后介绍了数组指针的定义方式和访问形式,解释了指向数组的指针如何操作多维数组。;
适合人群:正在学习或复习C语言指针和数组概念的学生或程序员,尤其是对指针与数组的关系感到困惑的学习者。;
使用场景及目标:①理解一维数组和指针之间的关系,掌握通过指针访问数组元素的方法;②掌握二维数组的不同访问形式及其地址运算规则;③学会定义和使用数组指针,能够灵活操作多维数组。;
阅读建议:由于指针和数组是C语言中较为抽象和复杂的知识点,建议读者在阅读时结合实际代码进行练习,以便更好地理解和记忆相关概念。同时,在遇到不
数据结构-单向循环链表.md
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}looplist;
looplist *looplistCreate()
{
looplist *h = (looplist *)malloc(sizeof(looplist));
h->data = (datatype)0;
h->next = h;
return h;
}
looplist *createNode(datatype value)
{
looplist *temp = (looplist *)malloc(sizeof(looplist));
temp->data = value;
temp->next = null;
return temp;
}
void looplistInsert(looplist *h, datatype value)
{
looplist *temp = createNode(value);
temp->next = h->next;
h->next = temp;
}
void looplistHeadPrint(looplist *h)
{
looplist *p = h;
while(h->next != p)
{
h = h->next;
printf("%-6d ", h->data);
}
putchar(10);
}
looplist *looplistCutHead(looplist *h)
{
looplist *p = h;
数据结构-单向链表.md
typedef struct node{
int data;
struct node *next;
}linklist;
linklist *linklistcreak()
{
linklist *h = (linklist*)malloc(sizeof(linklist));
h->data = 0;
h->next = NULL;
}
void linklistHeadInsert(linklist *h, int value)
{
linklist *temp = (linklist*)malloc(sizeof(linklist));
temp->data = value;
temp->next = NUll;
temp->next=h->next;
h->next = temp;
}
void linklistPrint(linklist *h)
{
while(h->next != NULL)
{
h = h->next;
printf("%-6d\n",h->data);
}
putchar(10);
}
int linklistIsEmpty(linklist *h)
{
return h->next == NULL ? 1 : 0;
}
int linklistHeadDelte(linklist *h)
{
if(linklistIsEmpty(h))
{
printf("linklist empty\n");
return -1;
}
int value;
value = h->next->data;