C语言常见面试题汇总
目录题1变量的声明和定义有什么区别题2写出bool 、int、 float、指针变量与“零值”比较的if语句题3sizeof和strlen的区别题4中的malloc和中的new有什么区别题5说明关键字volatile有什么含意题6写一个“标准”宏MIN题7设置地址为0x67a9的整型变量的值为0xaa66题8链表和数组有什么区别题9用变量a定义题10引用和指针的区别题11static的用法定义和用途题12const的用法定义和用途题13内存四区题14大小端问题题15静态局部变量在什么时候分配内存题16什么是不可重入函数和可重入函数题17#define宏定义与typedef的区别值传递改变值这类问题计算sizeof的值计算strlen的值char str[]和char *str数组作为函数参数传递数组指针和指针数组的问题\*p、 (\*p)、 \*p、 \*pconst 二级指针题1变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义不分配地址的称为声明。一个变量可以在多个地方声明但是只在一个地方定义。加入extern修饰的是变量的声明说明此变量将在文件以外或在文件后面部分定义。题2写出bool 、int、 float、指针变量与“零值”比较的if语句bool型数据if( flag ) { A; } else { B }int型数据if( 0 ! flag ) { A; } else { B }指针型数if( NULL flag ) { A; } else { B }float型数据const float EPSINON 0.000001;if (( flag -EPSINON ) ( x EPSINON )) { A }注意应特别注意在int、指针型变量和“零值”比较的时候把“零值”放在左边这样当把“”误写成“”时编译器可以报错否则这种逻辑错误不容易发现并且可能导致很严重的后果。题3sizeof和strlen的区别sizeof和strlen有以下区别sizeof是一个操作符strlen是库函数。sizeof的参数可以是数据的类型也可以是变量而strlen只能以结尾为‘\0‘的字符串作参数。编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。sizeof计算的是数据类型占内存的大小而strlen计算的是字符串实际的长度。数组做sizeof的参数不退化传递给strlen就退化为指针了。题4中的malloc和中的new有什么区别malloc和new有以下不同1new、delete 是操作符可以重载只能在C中使用。2malloc、free是函数可以覆盖C、C中都可以使用。3new 可以调用对象的构造函数对应的delete调用相应的析构函数。4malloc仅仅分配内存free仅仅回收内存并不执行构造和析构函数5new返回的是某种数据类型指针malloc返回的是void指针。注意malloc申请的内存空间要用free释放而new申请的内存空间要用delete释放不要混用。因为两者实现的机理不同。题5说明关键字volatile有什么含意volatile的作用作为指令关键字确保本条指令不会因编译器的优化而省略且要求每次直接读值。一个定义为volatile的变量就是说这个变量可能会被意想不到的改变这样编译器就不会去随便假设这个变量的值了。精确的说优化器在用到这个变量的值的时候必须每次都小心的重新读取这个变量的值而不是使用保存在寄存器里面的备份。下面是volatile变量的几个例子1. 并行设备的硬件寄存器如状态寄存器2. 一个中断服务子程序中会访问到的非自动变量Non-automatic variables)3. 多线程应用中被几个任务共享的变量题6写一个“标准”宏MIN#define min(a,b) ( (a)(b)?(a):(b) )注意在调用时一定要注意这个宏定义的副作用如下调用min(*p,x) 展开为 ((*p)(x)?(*p):(x)。p指针就自加了两次违背了MIN的本意。题7设置地址为0x67a9的整型变量的值为0xaa66*(int *)0x67a9 0xaa66;题8链表和数组有什么区别数组和链表有以下几点不同1存储形式数组是一块连续的空间声明时就要确定长度。链表是一块可不连续的动态空间长度可变每个结点要保存相邻结点指针。2数据查找数组的线性查找速度快查找操作直接使用偏移地址。链表需要按顺序检索结点效率低。3数据插入或删除链表可以快速插入和删除结点而数组则可能需要大量数据移动。4越界问题链表不存在越界问题数组有越界问题。说明在选择数组或链表数据结构时一定要根据实际需要进行选择。数组便于查询链表便于插入删除。数组节省空间但是长度固定链表虽然变长但是占了更多的存储空间。题9用变量a定义一个整型数 int a;一个指向整型数的指针 int *a;一个指向指针的指针它指向的指针是指向一个整型数 int **a;一个有10个整型数的数组 int a[10];一个有10指针的数组该指针是指向一个整型数 int *a[10];一个指向有10个整型数数组的指针 int (*a)[10];一个指向函数的指针该函数有一个整型数参数并返回一个整型数 int (*a)(int);一个有10个指针的数组该指针指向一个函数该函数有一个整型数参数并返回一个整型 int (*a[10])(int);题10引用和指针的区别(1). 指针是一个实体而引用仅是个别名(2). 引用使用时无需解引用*指针需要解引用(3). 引用只能在定义时被初始化一次之后不可变指针可变(4). 引用没有 const指针有 constconst 的指针不可变(5). 引用不能为空指针可以为空(6). “sizeof 引用”得到的是所指向的变量对象的大小而“sizeof指针”得到的是指针本身所指向的变量或对象的地址的大小(7). 指针和引用的自增运算意义不一样题11static的用法定义和用途1用static修饰局部变量使其变为静态存储方式(静态数据区)那么这个局部变量在函数执行完成之后不会被释放而是继续保留在内存中。2用static修饰全局变量使其只在本文件内部有效而其他文件不可连接或引用该变量。3用static修饰函数对函数的连接方式产生影响使得函数只在本文件内部有效对其他文件是不可见的这一点在大工程中很重要很重要避免很多麻烦很常见。这样的函数又叫作静态函数。使用静态函数的好处是不用担心与其他文件的同名函数产生干扰另外也是对函数本身的一种保护机制。题12const的用法定义和用途const主要用来修饰变量、函数形参和类成员函数1用const修饰常量定义时就初始化以后不能更改。2用const修饰形参func(const int a){};该形参在函数里不能改变3用const修饰类成员函数该函数对成员变量只能进行只读操作就是const类成员函数是不能修改成员变量的数值的。被const修饰的东西都受到强制保护可以预防意外的变动能提高程序的健壮性。constinta;intconsta;constint*a;//等于 int const *a;int*consta;intconst*consta;//等于 const int* const a;前两个的作用是一样a是一个常整型数。第三个意味着a是一个指向常整型数的指针也就是整型数是不可修改的但指针可以。第四个意思a是一个指向整型数的常指针也就是说指针指向的整型数是可以修改的但指针是不可修改的。最后一个意味着a是一个指向常整型数的常指针也就是说指针指向的整型数是不可修改的同时指针也是不可修改的。方便记忆以*为分界点,当const在*的左边时,实际物体值不变 当const在*的右边时,指针不变,即,左物右指 这样来记比较方便题13内存四区由C/C编译的程序占用的内存分为以下几个部分1.代码区存放函数体内的二进制代码有操作系统管理。2.全局区存放全局变量静态变量以及常量。这部分可以细分为data区和bss区2.1 .data区data区里主要存放的是显式初始化为非0的全局变量、静态变量和常量2.2 .bss区bss区主要存放的是未初始化的或显式初始化为0的全局变量、静态变量这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL2.3 常量区常量区是全局区中划分的一个小区域里面存放的是常量如const修饰的全局变量、字符串常量等3.栈区由编译器自动分配和释放存放函数参数局部变量等4.堆区由程序员分配释放若程序员未释放则程序结束之后编译器自动释放。注意const修饰的全局变量也储存在常量区const修饰的局部变量依然在栈上。有的分为5个区即代码区全局区常量区栈区堆区#includestdio.h#includemalloc.hinta0;//全局初始化区 .data段char*p1;//全局未初始化区 .bss段voidmain(){intb;// 栈chars[]abc;//s在栈上大小4字节。 abc\0为s的初始值可以不用纠结其存在哪里char*p2;//栈char*p3123456;//123456\0在常量区p3在栈上。staticintc0;//全局静态初始化区 .data段p1(char*)malloc(10);p2(char*)malloc(20);//分配得来的10和20字节的区域就在堆区。strcpy(p1,123456);//123456\0放在常量区编译器可能会将它与p3所指向的123456优化成一个地方。}https://blog.csdn.net/qq_42762607/article/details/110391819题14大小端问题大端:一个多字节整数,数字的高位部分存放在内存的低地址单元。低地址存高字节小端:一个多字节整数,数字的低位部分存放在内存的低地址单元。低地址存低字节大小端格式问题。方法一voidcheckCpuMode(void){inti0x12345678;char*cp(char*)i;if(*cp0x78)printf(little endian);elseprintf(big endian\n);}方法二voidcheckCpuMode(void){inta0x12345678;if((char)a0x12)printf(big endian\n);elseprintf(little endian\n);}方法三voidcheckCpuMode(void){union{shorts;charc[sizeof(short)];}un;un.s0x0102;if(un.[0]1un.c[1]2)printf(big endian\n);elseprintf(little endian\n);}题15静态局部变量在什么时候分配内存1、① static局部变量在编译阶段就已经分配内存空间了也就是函数没有调用前它就已经存在了。② 普通局部变量只有运行到定义该变量的时候才会分配内存空间。2、① 当执行完定义该static局部变量的函数体后该static变量的内存空间不会被释放只有程序结束时static变量才会自动释放。② 当执行完定义该普通局部变量的函数体后该普通局部变量的内存空间就会被释放。3、① 如果static局部变量不初始化那么它默认为0。② 如果普通局部变量不初始化那么它的值为随机数。4、① static局部变量的初始化语句只会执行一次下次再运行该初始化语句就不会被初始化但是它可以被多次赋值。② 每次运行该普通局部变量的定义时该变量都会被初始化。题16什么是不可重入函数和可重入函数不可重入函数 不能由超过一个任务所共享。不可以在它还没有返回就再次被调用。例如printfmallocfree等都是不可重入函数。可重入函数可以由多个任务并发使用而不必担心数据错误。可重入函数是在运行期间被打断而他的打断者又调用了它本身的情况下不会产生不可预期的运行结果的函数。【可重入函数】不为连续的调用持有静态数据不返回指向静态数据的指针所有数据都由函数的调用者提供使用本地数据或者通过制作全局数据的本地拷贝来保护全局数据如果必须访问全局变量记住利用互斥信号量来保护全局变量绝不在函数内调用任何不可重入函数【不可重入函数】函数中使用了静态变量无论是全局变量还是局部静态变量函数返回静态变量函数中调用了不可重入函数函数体内使用了静态的数据结构函数体内调用了malloc()或者free()函数函数体内调用了其他标准I/O函数总得来说如果一个函数在重入条件下使用了未受保护的共享资源那么他就是不可重入的题17#define宏定义与typedef的区别#define宏定义是字符替换typedef是定义类型是声明一种新的类型等同自带的基本类型。#define是宏处理的时候位于编译前阶段宏处理器基本上对你的C/C程序不会有任何的感知。它只处理宏的语法。而编译阶段的“程序”得到的是宏处理完的结果。typedef是编译阶段的一部分。它的意义是单一的。宏定义只是简单的字符串代换是在预处理完成的而typedef是在编译时处理的它不是作简单的代换而是对类型说明符进行重新命令。被命名的标识符具有类型定义说明的功能。#includestdio.h#definePIN1char*typedefchar*PIN2;voidmain(){//使用#define相当于char* x, y;就是说x是char指针类型而y是char类型如果要连续定义两个指针需要写成char *x, *y;PIN1 x,y;//使用typedef相当于char* x, char* y;就是说x是char指针类型而y也是char指针类型PIN2 a,b;printf(By #define %d %d\n\n,sizeof(x),sizeof(y));printf(By typedef %d %d\n\n,sizeof(a),sizeof(b));//system(pause);return0;}值传递改变值这类问题下面的代码有什么问题voidGetMem(char*p){p(char*)malloc(100);}voidmain(){char*strNULL;GetMem(str);strcpy(str,hello word!);printf(str);}分析程序崩溃。在上面已经分析过了传递给GetMem函数形参的只是一个副本修改形参p的地址对实参str丝毫没有影响。所以str还是那个str仍为NULL这时将字符串常量拷贝到一个空地址必然引发程序崩溃。下面的方法可以解决这个问题voidGetMem(char**p){*p(char*)malloc(100);}voidmain(){char*strNULL;GetMem(str);strcpy(str,hello word!);printf(str);free(str);//不free会引起内存泄漏}看似有点晦涩其实很好理解。本质上是让指针变量str指向新malloc内存的首地址也就是把该首地址赋值给指针变量str。前面我们说过指针传递本质上也是值传递要想在子函数修改str的值必须要传递指向str的指针(str本身就是指针指针的指针是二级指针)因此子函数要传递的是str的地址这样通过指针方式修改str的值将malloc的内存首地址赋值给str。计算sizeof的值charstr1[]{a,b,c,d,e};charstr2[]abcde;char*ptrabcde;charbook[][80]{计算机应用基础,C语言,C程序设计,数据结构};sizeof(str1)?sizeof(str2)?sizeof(ptr)?sizeof(book)?sizeof(book[0])?分析sizeof(str1)5就是5*sizeof(char)5sizeof(str2)6字符串都是以’0’结尾所以所占字节数为6sizeof(ptr)4ptr是一个指针在32位平台上大小为4字节sizeof(book)320book是一个二维数组4*80*1sizeof(book[0])80book[0]是第一维数组因为此80*1根据sizeof求数组元素的个数也很简单拿第一个来说就是sizeof(str1)/sizeof(char)。计算strlen的值chararryA[]{a,b,c,0,d,e};chararryB[]{a,b,c,d,e};chararryC[6]{a,b,c,d,e};char*strabcde;分析strlen(arryA) 3strlen遇到’\0’就会返回无论后面有多少个字符strlen(arryB)长度无法确定没有人为写入‘\0’strlen会继续计算直到找到结束符结果未知strlen(arryC)5指定了数组大小编译器会自动在空余地方添加’\0’这其实跟char arryC[6] {‘a’,‘b’,‘c’,‘d’,‘e’,‘\0’};等价。strlen(str) 5不包括结尾的’\0’。char str[]和char *str1下面的操作合法么出错的话会是在那个阶段编译时期还是运行时期charstr[]hello;str[0]s;//合法么char*strhello;str[0]s;//合法么分析这两个都可以成功编译只是第二个会在运行时期出现段错误。下面来分析一下首先hello是一个字符串常量存储在静态数据区域(data段)这是在编译时期就确定的。第一个是将字符串常量赋值给了一个变量全局变量在数据段局部变量在栈区实际上是将字符串常量拷贝到了变量内存中因此修改的只是str[]这个变量的值。第二个是将字符串常量的首地址赋值给指针str对指针str操作就是对字符串常量进行修改因此出现了段错误。2理解了上面的知识判断一下下面的true or falsecharstr1[]abc;charstr2[]abc;constcharstr3[]abc;constcharstr4[]abc;constchar*str5abc;constchar*str6abc;char*str7abc;char*str8abc;cout(str1str2)endl;cout(str3str4)endl;cout(str5str6)endl;cout(str7str8)endl;分析结果是 0 0 1 1先理解str1,str2,str3,str4他们是什么他们是数组名也就是数组首元素的地址”str1 str2“本质就是比较两个数组的地址是不是相同。上面我们说过编译器给他们分配了新的存储空间来对字符串abc进行拷贝这些变量在内存里是相互独立的因此他们的地址肯定不同再理解str5,str6,str7,str8他们是什么他们是指针他们的值就是字符串常量的地址它们都指向“abc所在的静态数据区所以他们都相等。数组作为函数参数传递看看下面的函数有啥问题intfunc(inta[]){intnsizeof(a)/sizeof(int);for(inti0;in;i){printf(%d ,a[i]);a[i];}}sizeof(a)/sizeof(int)一般是计算数组的元素个数结果却发现n的值总是1为什么会这样呢这是因为在C中将数组传递给一个函数时无法按值传递而是会自动退化为指针。下面的三种写法其实是等价的“int func(int a[20]);” 等价于 “int func(int a[]);” 等价于 “int func(int *a);”。数组指针和指针数组的问题1说出下面表达式的含义int*p1[10];int(*p2)[10];第一个是指针数组首先他是一个数组数组的元素都是指针。第二个是数组指针首先他是一个指针它指向一个数组。下面这张图可以很清楚的说明2写出下面程序运行的结果inta[5]{1,2,3,4,5};int*ptr(int*)(a1);printf(%d,%d,*(a1),*(ptr-1));分析答案是2,5。本题的关键是理解指针运算”1“就是偏移量的问题一个类型为T的指针移动是以sizeof(T)为单位移动的。a1:在数组首元素地址的基础上偏移一个sizeof(a[0])单位。因此a1就代表数组第1个元素为2a1在数组首元素的基础上偏移一个sizeof(a)单位a其实就是一个数组指针类型为int()[5]。因此a1实际上是偏移了5个元素的长度也就是a5再看ptr是int类型因此ptr-1就是减去sizeof(int*)即为a[4]5;a是数组首地址也就是a[0]的地址a1是数组下一个元素的地址即a[1] a是对象的首地址a1是下一个对象的地址即a[5]。*p、 (*p)、 *p、 *pinta[5]{1,2,3,4,5};int*pa;*p先取指针p指向的值数组第一个元素1再将指针p自增1 cout*p;// 结果为 1cout(*p);// 1(*p)先取指针p指向的值数组第一个元素1再将该值自增1数组第一个元素变为2cout(*p);// 1cout((*p))// 2*p 先将指针p自增1此时指向数组第二个元素*操作再取出该值 cout*p;// 2cout(*p)// 2*p 先取指针p指向的值数组第一个元素1再将该值自增1数组第一个元素变为2 cout*p;// 2cout(*p)// 2const 二级指针给定声明 const char * const *pp;下列操作或说明正确的是App B(*pp) C(**pp)c; D以上都不对分析答案是A。先从一级指针说起吧1const char p 限定变量p为只读。这样如p2这样的赋值操作就是错误的。2const char *p p为一个指向char类型的指针const只限定p指向的对象为只读。这样pa或 p等操作都是合法的但如*p4这样的操作就错了 因为企图改写这个已经被限定为只读属性的对象。3char *const p 限定此指针为只读这样pa或 p等操作都是不合法的。而*p3这样的操作合法因为并没有限定其最终对象为只读。4const char *const p 两者皆限定为只读不能改写。再来看二级指针问题1const char **p p为一个指向指针的指针const限定其最终对象为只读显然这最终对象也是为char类型的变量。故像**p3这样的赋值是错误的 而像*p p这样的操作合法。2const char * const *p 限定最终对象和 p指向的指针为只读。这样 *p?的操作也是错的但是p这种是合法的。3const char * const * const p 全部限定为只读都不可以改写下面是在VC环境中实测前面有红色标记则为报错好文推荐https://blog.csdn.net/jianpeng5/article/details/44998597https://blog.csdn.net/lyh290188/article/details/104304322https://blog.csdn.net/weixin_29133151/article/details/112114731

相关新闻

Windows安全攻防实战:从权限模型到漏洞利用与纵深防御

Windows安全攻防实战:从权限模型到漏洞利用与纵深防御

1. 项目概述:从权限到漏洞的Windows安全攻防全景在Windows系统的日常运维、渗透测试或安全加固工作中,我们常常会陷入一个误区:要么只关注某个具体的漏洞利用工具,要么只死记硬背几条安全策略。但真正的系统安全,是一个…

2026/7/27 17:22:29阅读更多 →
docker root dir(修改docker的默认目录)

docker root dir(修改docker的默认目录)

一、作用 一般我们新开的服务器,root的空间都不是很大,这时候,我们一般会增加一块别的硬盘。然后把自己的内容放到新的硬盘里。 二、docker info 使用docker info查看默认的目录 三、修改默认目录 (1)停止docker服务、防止文件损坏 sudo systemctl stop docker sudo …

2026/7/27 17:22:29阅读更多 →
企业垂直场景如何做大模型选型?企业客户关注国产化、成本和部署

企业垂直场景如何做大模型选型?企业客户关注国产化、成本和部署

企业垂直场景做大模型选型,核心不是寻找“参数最大”或“榜单第一”的模型,而是把业务场景、数据敏感度、国产化要求、部署方式、调用成本、响应延迟、RAG 检索能力和运维治理放在一起评估。B 端客户真正需要的是一套可组合、可替换、可审计、可持续降本…

2026/7/27 17:22:29阅读更多 →
终极B站直播推流码获取工具完全指南:告别官方限制,拥抱OBS自由

终极B站直播推流码获取工具完全指南:告别官方限制,拥抱OBS自由

终极B站直播推流码获取工具完全指南:告别官方限制,拥抱OBS自由 【免费下载链接】bilibili_live_stream_code 获取B站直播推流码,支持开关播,管理直播标题、分区,显示弹幕和礼物。 项目地址: https://gitcode.com/gh_…

2026/7/27 18:34:39阅读更多 →
Superpowers终极故障排除指南:让AI开发助手高效工作的7个关键技巧

Superpowers终极故障排除指南:让AI开发助手高效工作的7个关键技巧

Superpowers终极故障排除指南:让AI开发助手高效工作的7个关键技巧 【免费下载链接】superpowers An agentic skills framework & software development methodology that works. 项目地址: https://gitcode.com/GitHub_Trending/su/superpowers Superpow…

2026/7/27 18:34:39阅读更多 →
WP_Mock最佳实践:10个提升WordPress单元测试质量的实用技巧

WP_Mock最佳实践:10个提升WordPress单元测试质量的实用技巧

WP_Mock最佳实践:10个提升WordPress单元测试质量的实用技巧 【免费下载链接】wp_mock WordPress API Mocking Framework 项目地址: https://gitcode.com/gh_mirrors/wp/wp_mock WP_Mock是一个由10up和GoDaddy开发的WordPress API模拟框架,旨在为W…

2026/7/27 18:34:39阅读更多 →
深入解析TI DP83630以太网PHY芯片:接口模式、收发器原理与实战调试

深入解析TI DP83630以太网PHY芯片:接口模式、收发器原理与实战调试

1. 项目概述在嵌入式网络设备的设计中,物理层(PHY)芯片的选择与接口设计往往是决定项目成败的关键细节。它不像主控芯片那样引人注目,却实实在在地影响着整个系统的通信稳定性、功耗和成本。今天,我想深入聊聊德州仪器…

2026/7/27 18:34:39阅读更多 →
深入Paq-nvim源码:用500行Lua代码学习Neovim包管理器核心架构

深入Paq-nvim源码:用500行Lua代码学习Neovim包管理器核心架构

深入Paq-nvim源码:用500行Lua代码学习Neovim包管理器核心架构 【免费下载链接】paq-nvim 🌚 Neovim package manager 项目地址: https://gitcode.com/gh_mirrors/pa/paq-nvim Paq-nvim是一款用Lua编写的Neovim包管理器,以其简洁的设计…

2026/7/27 18:34:39阅读更多 →
2026年主流海关数据工具对比:外贸海关数据服务商全景盘点

2026年主流海关数据工具对比:外贸海关数据服务商全景盘点

2026年主流海关数据工具对比:外贸海关数据服务商全景盘点一、行业背景与需求趋势2026年,全球外贸市场正处于数字化转型的深化阶段,作为我国外贸核心聚集地的珠三角,拥有超20万家外贸企业,外贸获客模式已从传统线下展会…

2026/7/27 18:32:39阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →