
编程语言专题
文章平均质量分 84
编程语言专题
物联网研究室BBC
博主老陈,通信工程专业,接触物联网行业的第九个年头,含丰富的无线模组软件开发经验,擅长解决各种无线通讯问题
展开
-
编程语言专题《踩坑篇,Qt5.70中关于QWebkitWidgets的移除》
昨天欲使用QWebktiWidgets类编写Qt浏览器,却惊奇发现QWebkitWidgets这个类已从Qt5.70版本中移除;代替的类是QWebengineWidgets,如果要详细了解,可查阅Qt官方文档。这个改动不得不将QWebkitWidgets类程序向QWebengineWidgets类程序进行移植。这么大的改动Qt开发者应该第一时间了解并学习代码的移植。原创 2016-07-19 12:49:23 · 744 阅读 · 0 评论 -
编程语言专题《开发篇,Windows环境下Qt与MySQL编译环境配置》
1)windows环境下Qt与MySQL编译环境配置:(Qt版本:5.70,MySQL版本:5.70,符号"~"表示安装目录前面部分省略)第一步: 进入MySQL安装目录~/MySQL/MySQL Server 5.7/lib/下寻到libmysql.dll第二步: 把libmysql.dll文件复制到Qt安装目录下~/5.7/mingw53_32/bin/第三步: 配置环境变量:~\原创 2016-07-19 10:36:25 · 353 阅读 · 0 评论 -
编程语言专题《开发篇,C/C++堆栈及内存分区》
一、C/C++程序的内存分区1.栈区(stack):由编译器自动分配释放 。存放函数的参数值,局部变量(指非静态局部变量),其操作方式类似于数据结构中的栈。2.堆区(heap) :一般由程序员分配释放。 需要及时是否,否则会造成内存泄露,其操作方式类似于数据结构中的链表。3.全局区静态区(static):存放全局变量和静态变量。程序结束后由系统释放 。4.文字常量区:存放常量字符串。 程序...原创 2018-10-27 12:28:42 · 749 阅读 · 0 评论 -
编程语言状体《开发篇,C/C++函数传参的本质是值传递》
函数传参的本质还是值传递,如果需要改变 “指针的指向”(或者说指针变量),需要以 “指针的指针” 方式传递参数,而不能试图传递一个 “指针变量” 来改变指针的值因为传递 “指针变量” 只是相对与在函数里面创建一个新的指针指向同一个地址,“指针变量” 也是一个变量,只不过其变量值是一个地址值而已。终究是因为函数传参的本质还是值传递下面我们来看一个使用函数调用来交换两个数值的例子:#includ...原创 2018-10-30 00:49:49 · 560 阅读 · 0 评论 -
编程语言专题《开发篇,C语言字节对齐实例详解》
C编译器的缺省字节对齐方式(自然对界)在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成...原创 2018-10-23 23:29:37 · 448 阅读 · 0 评论 -
开发语言专题《开发篇,通过C语言获得计算机体系大端小端》
开发过程中,经常会有疑问所使用的嵌入式操作系统是大端规则还是小端规则,其实不用纠结,利用共用体的特点,编写一个简单的程序就能知道所用体系是大端规则还是小端规则:#include <stdio.h>// 小端返回真 1,大端返回假 0int isLittleEndian(){ union { char ch; int a; ...原创 2018-10-20 23:27:08 · 537 阅读 · 0 评论 -
编程语言专题《开发篇,C语言实现strcpy》
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:2分void strcpy( char *strDest, char *strSrc ){ while( (*strDest++ = * strSrc++) != '\0');}4分void strcpy( char *strDest, const char *strSrc ) //将源字符串加cons...原创 2018-10-20 23:13:50 · 492 阅读 · 0 评论 -
编程语言专题《开发篇,C语言strcpy与strlen陷阱》
关于strcpy与strlen的探究,请找出下列错误:试题一void test1(){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );}解答:字符串str1需要11个字节才能存放下(包括末尾的结束符),而string只有10个字节的空间,strcpy会导致数组越界。试题二void test...原创 2018-10-20 23:05:23 · 1083 阅读 · 0 评论 -
编程语言专题《开发篇,数组越界bug+数值溢出bug》
下面一个简单的C程序有2个bug:#include <stdio.h>#define MAX 255int main(){ unsigned char A[MAX], i; for (i=0; i<=MAX; i++) { A[i] = i; } return 0;}1)当i=255时数组越界,数组最大A[MAX-1]2)当i=255时,i+...原创 2018-10-20 22:36:54 · 640 阅读 · 0 评论 -
编程语言专题《开发篇,C语言交换变量值方法》
1.创建中间变量#include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;int main(){ int a=10; int b=20; int temp; printf(&amp;amp;quot;交换前a,b的值为:\n&amp;amp;quot;); printf(&amp;amp;quot;a=%d\n&amp;amp;q原创 2018-10-20 21:43:07 · 842 阅读 · 0 评论 -
编程语言专题《开发篇,C语言知识导图》
原创 2018-10-20 00:42:00 · 321 阅读 · 0 评论 -
编程语言专题《开发篇,为何int类型比char类型高效》
在编写程序时,32位系统中定义变量最好用int,这样效率高。因为32位系统中很多硬件本身都是32位的,配合定义的int型变量在内存中恰好分配4个字节,使得软件和硬件对于数据的处理非常契合,这样的工作效率自然就高。32位的硬件配置天生就适合定义32位的int型变量。千万不要单纯地认为定义char型变量由于分配了更小的内存空间,所以效率就更高,因此我们一直强调编写程序时要尽量配合硬件特点。很多...原创 2018-10-27 10:40:03 · 1668 阅读 · 0 评论 -
编程语言专题《开发篇,数组的优缺点》
优点:数组定义简单,而且访问很方便缺点:数组中所有元素类型都必须相同 数组大小必须定义时给出,而且大多数情况下,数组空间的大小一旦确定后就不能更改 数组的空间必须是连续的,这就造成数组在内存中分配空间时必须找到一块连续的内存空间。所以数组不可能定义得太大,因为内存中不可能有那么多大的连续的内存空间,而解决这个问题的方法就是使用链表。...原创 2018-10-27 11:07:54 · 6076 阅读 · 0 评论 -
编程语言专题《开发篇,C语言实现面向对象的方法》
对比C和C++,C语言的结构体的确有点类似C++类的概念,可使用结构体内嵌指针实现面向对象编程总体来说,C语言是面向过程的,但是C语言写出的Linux系统是面向对象的。非面向对象的语言,其实也是可以使用面向对象的思路来编写程序的。只是说用面向对象的语言来实现面向对象编程会更简单一些,但是C语言的高效性是其他面向对象编程语言无法比拟的。当然使用C语言来实现面向对象的开发相对不容易理解,这就是为什...原创 2018-10-27 11:20:53 · 2452 阅读 · 0 评论 -
编程语言专题《开发篇,C语言中 malloc、calloc、realloc 和free 函数的使用方法》
1、malloc()头文件:stdlib.h声明:void * malloc(int n);含义:在堆上,分配n个字节,并返回void指针类型。注意:内存是不干净的,还残留上一次数据返回值:分配内存成功,返回分配的堆上存储空间的首地址;否则,返回NULL2、calloc()头文件:stdlib.h声明:void *calloc(int n, int size);含义...原创 2019-09-12 17:24:01 · 410 阅读 · 0 评论 -
编程语言专题《开发篇,make工程管理器简介》
make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。makefile编写规则:1)Makefile的书写规则包含两个部分,一个是依赖关系,一个是生成目标的方法。2)Makefile中只有一个最终目标,第一条规则中的第一个目标将被确立为最终的目标。...原创 2019-03-03 09:40:17 · 515 阅读 · 0 评论 -
编程语言专题《开发篇,结构体成员指针反推该结构体变量的指针(内核链表里从小结构体指针找到大结构体指针)》
在 计算结构体中某个元素相对结构体首字节地址的偏移量 基础上进行结构体成员指针反推该结构体变量的指针计算结构体中某个元素相对结构体首字节地址的偏移量:https://blog.youkuaiyun.com/fengfeng0328/article/details/86775905#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->M...原创 2019-02-08 18:39:46 · 757 阅读 · 0 评论 -
编程语言专题《开发篇,计算结构体中某个元素相对结构体首字节地址的偏移量》
计算结构体中某个元素相对结构体首字节地址的偏移量,参考代码如下:#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)代码解析:(TYPE *)0 是一个强制类型转换,把 0 地址强制类型转换成一个指针,这个指针指向一个 TYPE 类型的结构体变量,实际上这个结构体变量可能不存在内存空间中,但是只要不去解...原创 2019-02-08 17:39:53 · 1011 阅读 · 0 评论 -
编程语言专题《开发篇,C语言如何欺骗const修饰的变量》
const的变量值真的不能更改吗?其实const机制是通过编译器检查实现的,程序在真正运行的过程中,并不关心变量是不是const的,只要我们能够保证编译不出错,然后在程序运行的过程中去修改即可。示例如下:int const a=10;int *p=(int*)&a;// p指向了a*p=100;// 运行后a=100了,值被改变了上面的例子,a的内容从10被修改为100...原创 2019-01-31 15:23:36 · 245 阅读 · 0 评论 -
编程语言专题《开发篇,C语言强制类型转换本身值不发生改变》
C语言强制类型转换本身值是不会发生改变的例如:flaot a = 12.34 ,int b = ( int ) a ,将浮点类型的a强制转换成int类型,a本身并没有发生改变,仍然是那个float类型。( int ) a 强制类型转换并赋值在底层实际分四个步骤:1.先在另外的地方找一个内存构建一个临时变量 x2.将 float a 的值的整数部分赋值给 x3.将 x 赋值给 b...原创 2019-01-06 23:42:33 · 3710 阅读 · 0 评论 -
编程语言专题《开发篇,‘\0‘、‘0‘、0 和 NULL 的区别》
1) '\0' 是一个转义字符,它对应的ASCII编码值是0,本质上就是02) '0' 是一个字符,它对应的ASCII编码值是48,本质上是483) 0 是一个数字,它就是0,本质上就是04) NULL 是一个表达式,是强制类型转换为void*类型的0,本质是0再谈NULL,NULL不是C语言关键字,本质上是一个宏定义,在C/C++中NULL的标准定义是这样的:#i...原创 2019-01-06 23:17:27 · 2702 阅读 · 0 评论 -
编程语言专题《开发篇,C语言 ( * ( void ( * ) ( ) ) 0 ) ( ) 的理解》
如果你是一名新C手,看到( * ( void ( * ) ( ) ) 0 ) ( ) 这种奇葩的表达式,肯定会懵逼,其实不用慌,既然编译器能够理解,那么人类也必定能够理解,不要忘记编译器是人类设计的1.里面看void ( * ) ( ) 是一个函数指针2.再看 ( void ( * ) ( ) ) 0 ) 表示把 0 强制转换为函数指针类型3.简化( void ( * ) ( ...原创 2019-01-06 21:07:35 · 579 阅读 · 0 评论 -
编程语言专题《开发篇,真正学会C语言union共用体、联合体》
1.C语言共用体的语法union 共用体名{ 数据类型 成员名; 数据类型 成员名; ... }变量名;2.共用体的特点共用体(也称联合体)所有成员共享同一片存储区/内存。因此联合变量每个时刻里只能保存它的某一个成员的值。3.共用体的详细规约1)共用体是一种几个变量共用使用同一片内存空间的数据结构,在不同的时间保存不同的数据类型和不同长...原创 2018-10-06 17:32:06 · 1261 阅读 · 0 评论 -
编程语言专题《开发篇,静态库与动态库的生成和使用》
首先上传测试用例https://download.youkuaiyun.com/download/fengfeng0328/10448481原创 2018-05-30 21:03:21 · 333 阅读 · 0 评论 -
编程语言专题《开发篇,C/C++中const的正确使用》
1.声明并初始化一个常变量:const int a=12;//a的值不能改变2.指向常量的指针变量:const 类型名 *指针变量名;int a=12,b=15;const int *p=&a;//定义了p为指向整型变量a的const指针变量*p=15;//试图通过p改变它指向的对象a的值,非法p=&b;//p改为指向b,合法但是要注意:a=15;//直接改变a的值,合法原创 2017-04-08 10:16:33 · 286 阅读 · 0 评论 -
编程语言专题《开发篇,C/C++中NULL的理解》
先不说这么多,上个程序再说:(编译器:vs2015)#includeusing namespace std;int main(){int t = NULL;char k[10];int *p = NULL;cout cout cout return 0;}看完程序也基本了解了:在一些编译系统中,在iostream头文件中已定义了符号常量NUL原创 2017-04-08 10:44:32 · 2941 阅读 · 0 评论 -
编程语言专题《开发篇,C++中的引用》
引用的性质:如果在程序中声明了b是变量a的引用,实际上在内存中为b开辟了一个指针型的存储单元,在其中存放变量a的地址,输出引用b时,就输出b所指向的变量a值,相当于输出*b。(只是不是这么书写罢了!)引用其实就是一个指针常量,它的指向不能改变,只能指向一个指定的变量。所以,引用的本质还是指针,所有的引用的功能都可以由指针实现。C++之所以增加引用的机制,是为了方便用户,用户可以不必具体去处理地址,原创 2017-04-08 10:57:24 · 234 阅读 · 0 评论 -
浅谈 C++ 中的 new/delete 和 new[]/delete[]
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?…如果你对这些问题都有疑问的话,转载 2017-04-08 19:26:26 · 198 阅读 · 0 评论 -
编程语言专题《开发篇,C++中一种输入字符串的方法》
以下程序灵活使用了getchar()函数,使可以输入任意格式的字符串:char *Str;//声明一个字符串指针Str = new char[n+1]; //分配内存(其中n是输入字符串的最大长度)for(int k=0; k{ Str[k]=getchar(); if(Str[k]=='\n')//当输入字符串按下enter键时结束{ Str[k]原创 2017-04-08 19:55:16 · 364 阅读 · 0 评论 -
编程语言专题《开发篇,C/C++中头文件多次包含的问题》
问题来源:假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次头文件A,那么问题来了,编译时会报大量的重复定义错误。解决方法:例如要编写头文件test.h在头文件开头写上两行:#ifndef _TEST_H//这是"if not defined"的简写,是宏定义的一种原创 2017-04-09 00:40:30 · 1063 阅读 · 0 评论 -
编程语言专题《开发篇,C++中对象指针数组类》
这里就不介绍什么是二级指针了,直接看程序领会吧!!typedef Student * PStudent;PStudent *stud;//Student **stud;stud=new PStudent[5];//stud=new Student *[5];每一维都是一个指针for(int k=0;kstud[k]=new Student();相对于我来说,原创 2017-04-09 18:46:28 · 4736 阅读 · 0 评论 -
编程语言专题《开发篇,C++中静态初始化数组与动态初始化数组》
静态初始化的数组的长度必须是在程序中确定的常数,不能是由用户输入的变量例子:int a[10];//正确Student stud[10];//正确:Student是一个学生类int n;cin>>n;int a[n];//错误int n;cin>>n;Student stud[n];//错误:Student是一个学生类动态初始化数组可以使用用户输入的变量作为数组原创 2017-04-10 20:32:10 · 5875 阅读 · 1 评论 -
编程语言专题《开发篇,C/C++插入一个元素的思路》
要求:往一个已经按从小到大排序好的数组插入一个元素x,插入后的数组依然按从小到大排序的本题需要分两种情况:1.插入元素x不在数组尾部(需要移动插入元素x后边的所有元素)第一步:找到插入元素x应该插入的位置的标号(先不要插入,以免原来到的数组元素被覆盖)第二步:找到插入的位置后,把插入元素x后边的元素全部向右移动sizeof(int)个字节,注意:要从数组尾部开始移动,不然会造成数组原创 2017-04-11 17:47:00 · 1736 阅读 · 0 评论 -
编程语言专题《开发篇,有趣的字符串常量》
这是一个很容易犯错的地方:字符串常量值是不可改变的,整个字符串就是一个常量#includeusing namespace std;int main(){char *p = "Hello World!";//声明并初始化一个字符串常量指针pchar str[] = "Hello World!";//声明并初始化一个字符数组strp[0] = 'K';//错误:试图改变字符原创 2017-04-08 00:14:42 · 268 阅读 · 0 评论 -
编程语言专题《开发篇,C语言数组长度可以是一个变量吗》
const int limit=100;char plum[limit];error:integral constant expression expected(错误,期待整型常量表达式)我们不想问:“为什么一个const int不能被当作一个整形常量表达式”,这样令人尴尬的问题。的确很无语,因为它在C++中是合法的!!!原创 2017-04-07 10:24:19 · 10429 阅读 · 6 评论 -
编程语言专题《开发篇,有关动态内存分配理解》
静态存储分配:通常定义变量时,编译器在编译时根据该变量的类型,在适当的时候为他们分配所需的内存空间大小,这种内存分配称为静态存储分配。动态存储分配:编译器在编译时就没有预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。内存分区可分为四大部分:(栈内存自动释放,堆内存delete释放)1.全局数据区:全局变量、静态数据常量2.代码区:原创 2017-04-07 11:33:38 · 514 阅读 · 0 评论 -
编程语言专题《开发篇,一个由C/C++编译的程序占用的内存分几个部分》
一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储原创 2017-04-08 00:03:34 · 394 阅读 · 0 评论 -
编程语言专题《开发篇,大话C/C++语言自增(++)自减(--)运算符》
1)a++++++b的含义是什么?答案:a++ + ++b解释:由词汇分析中的“贪心法”,也称“大嘴法”和结合实际意义分析可得答案。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多的字符。需要注意的是:除了字符串与字符常量,符号的中间不能嵌有空白(空格符,制表符,换行符)。例如:++是自增运算符,而+ +是两个符号。2)((a++)++)+b的含义是什么原创 2016-07-19 02:04:04 · 457 阅读 · 0 评论 -
编程语言专题《开发篇,squash[i][j]的声明方式可能性》
两个下标的二维数组和一维指针数组所存在的一个问题是:当你看到squash[i][j]这样的引用形式时,你并不知道squash是声名为:int squash[23][12];int *squash[23];int **squash;int (*squash)[12];原创 2017-04-06 21:51:01 · 1406 阅读 · 0 评论 -
编程语言专题《开发篇,数组和指针参数是如何被编译器修改的》
“数组名被改写成一个指针参数”规则并不是递归定义的,数组的数组会被改写为“数组的指针”,而不是“指针的指针”:实参所匹配的形式参数数组的数组char c[8][10];数组指针char(*c)[10];指针数组char *c[15];指针的指针char**c;数组指针(行指针)char(*c)[64];不改变char(*c)[原创 2017-04-07 09:56:11 · 460 阅读 · 0 评论