公共-C/C++语法
文章平均质量分 58
仅限语法
孙八瓶
这个作者很懒,什么都没留下…
展开
-
关于指针作为函数参数的问题(即pthread_mutex_t * mMutex 错误)
最近在学习linux,使用到了多线程、线程池。涉及到线程锁,发现别人都是而我个人觉得这样太麻烦,既然传递的都是指针,为什么不直接创建指针。于是这么写不出意外的意外,出错了。“段错误”。傻了,这是空指针。原创 2023-12-07 22:19:56 · 441 阅读 · 0 评论 -
【linux】线程池(Linux +C)
(1)使用线程池之后,将任务和线程分离,建立一定数量的线程,使线程重复利用(不销毁),不断将任务添加到线程中。(c)创建任务队列(task类型):pool->taskQ = (Task*)malloc(sizeof(Task) * queueSize);(2)根据任务数量增减,自动添加或者减少线程,使得线程维持在最优数量,节约系统资源。(a)通过线程池提供的api函数,将待处理的任务添加到任务队列,或者从任务队列删除;(c)线程池的使用者,也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程。原创 2023-12-04 13:53:22 · 917 阅读 · 0 评论 -
C++:new的用法
虽然对象1及3的空间被回收,但对象1与3并未析构!这一点将时刻提醒我们使用定位new需要自己显式调用析构函数,完成对象的析构!显然,如果类动态地为其成员分配内存,这将引发问题!,所以,当我们使用定位new创建对象必须自己保证不会覆盖任何不想丢失的数据!new只申请内存空间,相当于malloc,delete相当于free。1.new operator(初始化对象=申请内存空间+内存定位)换句话说就是,现在空间已经有了,不需要。在已有的空间上调用构造函数构造对象而已。指向的对象位于内存缓冲区,该空间并不是。原创 2023-11-30 14:53:06 · 9294 阅读 · 0 评论 -
C++:类
1.默认情况下,编译器会给类至少添加3个构造函数1)默认构造函数(无参,函数体为空)2)默认析构参数(无参,函数体为空)3)默认拷贝构造函数,为所有的属性进行值拷贝。2.如果我们提供了有参构造函数,编译器不再提供默认构造,但是会提供拷贝构造函数。3.深拷贝和浅拷贝1)浅拷贝:默认拷贝构造函数,简单的赋值拷贝。2)深拷贝:自己实现拷贝构造函数,重新申请堆区空间,进行拷贝操作。防止空间重复释放的问题。析构要配合释放堆区内存。浅拷贝的问题:注意:如果成员中有堆区操作,要原创 2022-05-20 08:32:00 · 466 阅读 · 0 评论 -
C++:名称空间
1.目的:解决名称(变量、函数、结构、枚举、类、类和结构的成员)冲突问题2.核心思想:声明名称的作用域3.用法1)名称空间可以是全局的,也可以位于另一个名称空间中。但是不可以在代码块中。2)访问名称空间中的成员,通过作用域解析运算符::namespace Jcak{ double pail; void fetch(); int pal;}namespce Jill{ double bucket(double n){...} double fet原创 2022-05-16 21:53:30 · 323 阅读 · 0 评论 -
C++:函数重载
1.函数重载的条件:1)相同的作用域;2)函数名称相同;3)参数类型 或 参数个数 或 参数顺序 不同;2.注意事项1)引用。int & 和 const int & 是两种类型;2)默认参数 会产生二义性void fuc(int a,int b=10){ return a+b;}void fuc(int a){ return a;}int main(){ fuc(10);}比如上面的例子,程序会不知道它调用的是哪原创 2022-05-17 20:25:43 · 235 阅读 · 0 评论 -
C++ :引用
1.概论1)引用是已定义的变量的别名。2)引用的主要用途是作为函数的形参。2.创建引用变量#include <iostream>int main(){ using namespace std; int rats =101; int & rodents= rats;//&不是地址运算符,而是将rodents声明为引用int &; cout << "rats="<<rats; cout <<原创 2022-05-15 16:20:20 · 204 阅读 · 0 评论 -
fabs函数 与 if else函数 性能测试
#include <iostream>#include <cmath>#include <ctime>using namespace std;const int MAX = 10000;int a[MAX];int main(){ int i, j, n = MAX; int rep = 60; //重复次数 clock_t beg, end; for (i = 0; i < n; i++) a[i] .原创 2021-04-20 14:31:08 · 260 阅读 · 0 评论 -
关于整除符号 / 的运用
整除除法(/)在C语言中规定。如果除法(/)运算的两个变量均为整数,则结果为整除取整,否则结果就为浮点数。假设定义int a=10; 那么a/3=3;直接斩断取整。 a/3.0=3.33333;结果为浮点数。所以有时候为了数据准确,可以将某个常数定为浮点数。...原创 2019-12-23 16:40:47 · 5418 阅读 · 0 评论 -
浮点数的舍入方案(IEEE标准)
1.浮点数不可能精确表示每一个数的,比如0.2。因此对于值x,我们一般想用一种系统的方法,能够找到最接近的匹配值2.IEEE规定了4种舍入方案。向偶数舍入、向零舍入、向上舍入、向下舍入。系统默认采用 向最接近的值舍入(round-to-nearest)。这是基础,其他三种方式用于计算上下界。即向最接近的设舍入(round-to-nearest)是一个总称。它具体采用哪一种方...原创 2019-12-23 16:24:11 · 7385 阅读 · 1 评论 -
提高程序运算速度
1.求余运算 a=a%8;可以改为: a=a&7;说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n方的余数,均可使用位操作的方法来代替。2.平方运算 a=pow(a, 2.0);可以改为: a=a*a;说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多,因为浮点数的求平方是通过调用子程序来实现的,在自带硬件乘法器的AVR单片机中,如A...原创 2021-04-20 16:15:35 · 912 阅读 · 0 评论 -
字节对齐
结构体的大小绝大部分情况下不会直接等于各个成员大小的总和,编译器为了优化对结构体成员的访问总会在结构体中插入一些空白字节,有如下结构体:struct align_basic{char c;int i;double d;};那么此时sizeof(align_basic)的值会是sizeof(char)+sizeof(int)+sizeof(double)的值么?如上图经过测试我们发现其大小为16个字节并不等于1+4+8=13个字节,可知编译器给align_basic结构体插原创 2021-06-11 09:31:50 · 277 阅读 · 0 评论 -
1.浮点数(float)与整型数(int)的转换
1.浮点数(float/double)转整型数(int)————向零舍入假设定义float a=1.3,b=1.6,c=2.0;int aa,bb,cc;使用强制转换aa=(int)a;bb=(int)b;cc=(int)c;结果aa=1;bb=1;cc=2;在处理时为了四舍五入。aa=(int)(a+0.5);bb=(int)(b+0.5);c...原创 2019-12-23 10:48:37 · 84464 阅读 · 3 评论 -
C语言找错题
1.void test1(){ char string[10]; char* str1 = "0123456789"; strcpy(string, str1);}解答:字符串str1有11个字节(包括末尾的结束符'\0'),而string只有10个字节,故而strcpy会导致数组string越界。2.void test2(){ char string[10], str1[10]; int i; for(i=0; i<10; i++) {原创 2021-04-25 14:56:11 · 1407 阅读 · 0 评论 -
C语言之动态内存管理(动态内存函数)
我们开辟空间的时候,空间的大小是固定的。在数组申明的函数,必须要指定数组的长度,它所需要的内存在编译时分配的。但是如果想要开辟不固定大小的空间,该怎么办?解决方式就是动态进行内存的分配,即在堆上开辟空间。本篇博客将介绍如何动态开辟空间。一、动态内存函数C语言中与动态内存管理相关的函数,主要有四个malloc、free、calloc和realloc。1.mallocvoid* malloc(size_t size);该函数是开辟一个大小为size字节大小的空间。返回值:若开辟失败,转载 2020-07-05 16:50:27 · 530 阅读 · 0 评论 -
用指针冒充数组
1.指针指针变量和普通变量一样,有两个要素:1)指针本身是占用内存的,32位机器是4个字节;2)指针变量的值是保存着某个对象的地址;指针的类型决定了步进的长度,指针类型有int* 、double*、float*、void*,其中void只表明了这是指针,没有标明具体类型,所以步进长度不确定。2.数组1)数组的大小必须在定义时确定,在程序中不可以更改2)同一个数组中的数组元素在内存中...原创 2019-11-12 15:45:03 · 1282 阅读 · 0 评论 -
pow()函数:求x的y次方的值 性能测试
算法主要耗时在多次求不同整数的平方。当用pow函数求时,超时;而直接乘才1ms。于是就写了一段代码来测试pow的性能首先产生60个随机整数,然后重复60次求整数的平方.#include <iostream>#include <cmath>#include <ctime>using namespace std;const int MAX = 10000;int a[MAX];int main(){ int i, j, n = MAX;原创 2021-04-20 13:47:36 · 536 阅读 · 0 评论 -
C语言编程总结(一)
1.输入输出语句c语言中的输入输出语句都是通过标准库实现的,比如你输入用的scanf 输出用的printf putchar 之类的 都是库函数。所以,C语言本身不提供输入输出语句,而是通过标准库实现。2.虚函数3.gcc什么是gcc / g++首先说明:gcc 和 GCC 是两个不同的东西GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。gcc是GCC.原创 2021-04-26 17:33:26 · 390 阅读 · 0 评论 -
C语言编程总结(三)
1.多维数组和指针 从二维数组的角度看,x代表的是二维数组首元素的地址,现在的首元素不是一个简单的整型元素,而是由四个整型元素所组成的一维数x代表的是首行(即第0行)的首地址。x+1代表第1行的首地址。x[0]、x[1]、x[2]、x[3]、x[4]、x[5]既然是一维数组名,而C语言由规定了数组名代表数组首元素地址,因此x[0]代表一维数组x[0]中第0列元素的地址,即&x[0][0]。x[1]的值是&x[1][0],以此类推。 请考虑0行1列的元...原创 2021-05-08 10:39:54 · 921 阅读 · 0 评论 -
C语言面试题(一)
1.预处理1)问题1:什么是预编译?何时需要预编译?答:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.2)问题2:何时需要预编译?答:总是使用不经常改动的大型代码体。 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。3)问题3:写一个“标准”宏,这个宏输入两个参...转载 2021-04-25 14:22:15 · 293 阅读 · 0 评论 -
fmod()函数
1.fmod()函数声明double fmod(double x, double y);2.解释参数 x代表分子的浮点数参数 y代表分母的浮点数返回 返回x/y的余数3.实例#include <stdio.h>#include <math.h>int main (){ float a, b; int c; ...原创 2019-11-22 10:59:12 · 2196 阅读 · 0 评论