
——C
文章平均质量分 53
C
EmbededCoder
C, Python, C++, Qt, MCU, RTOS, ARM Cortex-M, Linux
展开
-
别在int与float上栽跟头
别在int与float上栽跟头 int与float是我们每天编程都用的两种类型,但是我们真的足够了解它们吗。昨天在博客园看到一个比较老的笑话:“昨天晚上下班回家,一民警迎面巡逻而来。突然对我大喊:站住!民警:int 类型占几个字节? 我:4 个。 民警:你可以走了。 我:为什么问这样的问题? 民警:深夜还在街上走,寒酸苦逼的样子,不是小偷就是程序员。”(注:看到有朋友评论说占几个字节跟具体的环境有关,学过C++的都知道,在C++这样的语言中确实取决于环境,但是在Java跟C#中不管什么环...转载 2021-11-17 19:05:32 · 185 阅读 · 0 评论 -
C语言隐式类型转换和整型提升
C语言隐式类型转换 算术运算式中,低类型转换为高类型 赋值表达式中,表达式的值转换为左边变量的类型 函数调用时,实参转换为形参的类型 函数返回值,return表达式转换为返回值类型对于上面的隐式类型转换规则,绝大多数学c语言或者说学编程的人都知道。那下面我们看一个有趣的例子吧:#include <stdio.h>int main(){ int i = -2; unsigned int j = 1; if( (i + j) >= 0 ...转载 2020-07-03 10:14:08 · 2833 阅读 · 0 评论 -
const局部变量存储位置
//const局部变量#include <iostream>#include <string>using namespace std;int main(){const int *np; {const intvar0= 10; //从运行结果可知var未存储在栈上np= &var0; } int var1 = 12; //假设var0存储在栈上,定义后将被var1覆盖...转载 2020-06-30 16:18:48 · 1194 阅读 · 1 评论 -
C语言 —卫语句
函数中的条件逻辑使人难以看清正常的执行途径。使用卫语句表现所有特殊情况。动机:条件表达式通常有2种表现形式。第一:所有分支都属于正常行为。第二:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况。这2类条件表达式有不同的用途。如果2条分支都是正常行为,就应该使用形如if……else……的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”。Replace Nested Conditional with Guard C.转载 2020-06-11 08:57:33 · 1653 阅读 · 0 评论 -
libc,glibc和libc关系
【glibc 和 libc】glibc 和 libc 都是 Linux 下的 C 函数库。libc 是 Linux 下的 ANSI C 函数库;glibc 是 Linux 下的 GUN C 函数库。ANSI C 和 GNU C 有什么区别呢? ANSI C 函数库是基本的 C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其中包括:<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原...转载 2020-06-04 14:45:46 · 599 阅读 · 0 评论 -
__attribute__概述
__attribute__ 关键字允许指定变量、类型和函数的属性该关键字的格式如下所示 __attribute__((attribute1, attribute2, ...)) __attribute__((__attribute1__, __attribute2__, ...)) 例如 void * Function_Attributes_malloc_0(int b) __attribute__((malloc)); static int b ..转载 2020-05-21 10:41:05 · 1489 阅读 · 0 评论 -
__attribute__((used)) __attribute__((section(x)))
1、通知编译器在目标文件中保留一个静态函数,即使它没有被引用。2、标记为attribute__((used))的函数被标记在目标文件中,以避免链接器删除未使用的节。3、静态变量也可以标记为used,方法是使用 __attribute__((used))。4、例程static int lose_this(int);static int keep_this(int) __attribute__((used)); // retained in object filestatic int ke转载 2020-05-21 10:34:27 · 22486 阅读 · 14 评论 -
C 语言中的匿名联合体和匿名结构体
在 C 语言中,可以在结构体中声明某个联合体(或结构体)而不用指出它的名字,如此之后就可以像使用结构体成员一样直接使用其中联合体(或结构体)的成员。...转载 2020-04-24 13:29:29 · 5849 阅读 · 0 评论 -
C语言数组操作和指针操作谁更高效
1. 数组和指针操作对比#include <stdio.h>int main(){ char *char_p, char_arr[5]={0,1,2}; short *short_p, short_arr[5]={1,2,3}; int *int_p, int_arr[5]={2,3,4}; char_p=c...转载 2020-04-15 15:25:29 · 2207 阅读 · 0 评论 -
pthread_join()详解及实验
pthread_join()函数原型:int pthread_join(pthread_t thread, void **retval);args: pthread_t thread: 被连接线程的线程号 void **retval : 指向一个指向被连接线程的返回码的指针的指针return: 线程连接的状态,0是成功,非0是失败1.为什么要使用pthread...转载 2020-03-05 18:11:00 · 36416 阅读 · 2 评论 -
pthread_testcancel用法简介
文章目录pthread_testcancel用法简解pthread_testcancel用法简解某些情况下,希望通过pthread_cancel结束某个线程,但是被结束的线程必须在某一个点来进行退出操作,就需要用到pthread_testcancel。示例代码如下#include <pthread.h>#include <iostream>#incl...转载 2020-02-26 14:26:18 · 1553 阅读 · 0 评论 -
多线程pthread_join()的两种作用
pthread_join()函数原型:int pthread_join(pthread_t thread, void **retval);args:pthread_t thread: 被连接线程的线程号void **retval : 指向一个指向被连接线程的返回码的指针的指针return:线程连接的状态,0是成功,非0是失败当调用 pthread_jo...转载 2020-02-26 12:40:56 · 1248 阅读 · 0 评论 -
pthread_attr_init () 线程属性函数使用
1.【线程属性】线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。调用pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destroy函数。如果pthread_attr_...转载 2020-02-26 12:38:52 · 522 阅读 · 0 评论 -
printf--动态指定输出格式长度
char a1[] = {'A', 'B', 'C'};char a2[] = "world";printf("[%.*s][%.*s]\n", 2, a1, 10, a2);printf("[%.*s][%.*s]\n", sizeof(a1), a1, sizeof(a2), a2);printf("[%-*d]\n", 4, 'A'); //产生"65 "printf(...原创 2020-01-10 14:44:06 · 777 阅读 · 0 评论 -
快速排序(过程图解)
假设我们现在对“612 79345 108”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。 312 546...转载 2020-01-08 13:00:33 · 666 阅读 · 0 评论 -
随机数-C
#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){ srand((unsigned int)time(NULL)); int a = rand(); printf("a==%d\r\n\r\n",a); a = r...原创 2020-01-04 20:38:42 · 1270 阅读 · 0 评论 -
C语言常用库函数实现(一)_内存拷贝
库函数的实现也是面试中的常考题,因为这是最能体现C语言功底的。一、strcpy与strncpy 先看一下函数的原型: strcpy函数可以按如下的方式实现:点击(此处)折叠或打开char*strcpy(char*strDest,constchar*strSrc) { if(strDest==NULL) ||...转载 2019-10-17 15:53:03 · 3359 阅读 · 1 评论 -
%llu 64位无符号%d、%u、%x/%X、%o%f、%e/%E或%g/%G
hhd,hhx,hhu, 这几个都是输出8位的,hd, hx, hu, 这几个都是输出16位数据的,d, lx, ld, lu, 这几个都是输出32位的,lld,ll, llu,llx,这几个都是输出64位的,printf( "%llu ",.....)%llu 是64位无符号%llx才是64位16进制数Dev-C++下基本数据类型学习小结环境...转载 2019-10-17 10:23:53 · 14623 阅读 · 1 评论 -
C陷阱篇之移位运算
C语言移位运算有一些不确定性及误区,主要包含两个问题:右移运算的空出位用0还是符号位填充?换句话右移n位与除以2n是否等价?无符号整数右移,左边空位会用0填充,所以无符号右移n位与除以2n等价。有符号整数右移,用0还是符号位填充由编译器自行决定,C标准中未定义。当有符号数为正数时,符号位也为0,所以总是用0填充,右移n位与除以2n等价;当有符号数为负,右移后填充位可能...转载 2019-07-10 14:09:05 · 662 阅读 · 0 评论 -
printf vsprintf
int printf(const char *fmt, ...){ char buf[1024]; va_list args; int cnt; va_start(args, fmt); cnt = vsprintf(buf, fmt, args); va_end(args); putstr(buf); ...原创 2019-05-14 10:39:50 · 493 阅读 · 0 评论 -
C C++ 预定义宏
vs项目中见过这种获取 当前函数名的调用。觉得挺方便的就记录一下。==============================================================__FILE____LINE____DATE____TIME____FUNC____FUNCTION__在Visual Studio 2005中,默认情况下,此特性是激活的,但不能...转载 2019-08-02 09:29:34 · 283 阅读 · 0 评论 -
C/C++宏定义
看了一下驱动结构,结构基本没怎么变,但发现多了相当多的宏定义,如果你是高手就绕道行吧,这里在温习一下宏定义相关的东西 :-(一. 初级用法#define to_string(a) #a// 把参数a转换成字符串#define to_char(a) ...转载 2019-05-21 15:29:50 · 1604 阅读 · 0 评论 -
strnlen函数
函数原型:size_t strnlen(const char *s, size_t maxlen);功能:获取字符串s中实际字符个数,不包括结尾的'\0';如果实际个数 <= maxlen,则返回n,否则返回第二个参数。if ( 实际长度 <= maxlen){return 实际长度}else {return ma...转载 2019-05-10 15:40:38 · 28944 阅读 · 0 评论 -
C 库函数标准库
assert.hC 库宏 - assert()ctype.hisalnum()isalpha()iscntrl()isdigit()isgraph()islower()isprint()ispunct()isspace()isupper()isxdigit()tolower()toupper()errno.herrnoEDOMERANGElo...原创 2019-05-15 12:43:22 · 535 阅读 · 0 评论 -
c语言的结构体
1.结构体的概念结构体是一种复合型数据类型,同属于复合型数据类型的还有联合体。结构体可以理解为是一种自定义类型,用于对其他数据类型(什么int型,double型,float型等等)的打包。c语言中正是因为结构体的存在,使其代码具有封装性,可以基于面向对象思想来编程。2.结构体的声明、定义假设我们要用结构体来表现一个班级的信息,可以为:struct class_t{ char* c...转载 2019-05-14 12:17:25 · 234 阅读 · 0 评论 -
C语言中"#"和"##"的用法
1. 前言使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.2. 一般用法#include<cstdio>#include<climits>using namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){ printf(STR(vck))...转载 2019-04-18 16:02:13 · 802 阅读 · 0 评论 -
结构体中占位符的用法
typedef union{ struct x{ char a1 : 2; char b1 : 3; char c1 : 3; }x1; char c;}my_un;int main(){ my_un a; a.c = 100; printf("%d/n",a.x1.c1); printf("%d/n",si...转载 2019-04-23 12:35:09 · 2735 阅读 · 0 评论 -
__user 说明
# define __user__attribute__((noderef, address_space(1)))__user这个特性,即__attribute__((noderef, address_space(1))),是用来修饰一个变量的,这个变量必须是非解除参考(no dereference)的,即这个变量地址必须是有效的,而且变量所在的地址空间必须是1,即用户程序空间的。这里...转载 2019-04-15 13:26:16 · 8967 阅读 · 0 评论 -
转载-strcpy 为什么需要返回值 为char*
有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。例如字符串拷贝函数strcpy 的原型:char *strcpy(char *strDest,const char *strSrc);strcpy 函数将strSrc 拷贝至输出参数strDest 中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:char str[20];int length...转载 2018-07-12 13:36:38 · 4251 阅读 · 0 评论 -
C语言结构体初始化的四种方法
定义struct InitMember{ int first; double second; char* third; float four;};方法一:定义时赋值struct InitMember test = {-10,3.141590,"method one",0.25};需要注意对应的顺序,不能错位。方法二:定义后逐个赋值struct In...转载 2019-06-02 17:16:53 · 8234 阅读 · 1 评论 -
__attribute__ ((__packed__))关键字
不想要字节对齐的时候,有没有办法取消字节对齐?答案是可以,就是在结构体声明当中,加上__attribute__ ((__packed__))关键字,它可以做到让我们的结构体,按照紧凑排列的方式,占用内存。来段实际代码:#include <stdio.h>#include <iostream>using namespace std;struct test1 ...转载 2019-06-03 14:04:32 · 21113 阅读 · 4 评论 -
关于vs2013error C4996: ......The POSIX name for this item is deprecated.的错误解决办法!
解决办法(如图2)在头文件处添加#pragma warning(disable: 4996)原创 2019-07-24 14:24:35 · 3623 阅读 · 0 评论 -
cosnt介绍
***const***类型const,翻译过来为常量,或许理解为 只读 更好。1.const语法对非指针变量,const无论放在类型前或后,都表示变量属性为只读,运行过程中不能也不会赋值修改。如const int a;和int const a;这两种方式const作用相同,都表示a是一个常整型数。而const修饰指针时则有所不同,分三种情况:const int a; int * cons...转载 2019-07-11 09:15:33 · 1467 阅读 · 0 评论 -
C陷阱篇之enum默认长度
C陷阱篇之enum默认长度enum型用于定义常量集合,相比#define有一些优势,如:enum是一种数据类型,使用时会检查类型匹配;enum增加了范围约束,避免变量赋值和使用时超出定义范围。但enum也有一个隐含问题:enum变量占用的空间与编译器相关。多数编译器默认enum型长度等于int型,很多人也把enum型变量等同于int,但C标准在这里留下了尾巴:“枚举型尺寸是能够容纳...转载 2019-07-11 09:14:21 · 1167 阅读 · 0 评论 -
C语言文本方式和二进制方式打开文件区别
转自:http://blog.sina.com.cn/s/blog_50b7dd7101012979.html,我们都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?我觉得,对于编程人员,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制)打开这个文件,用什么函数读写这个文件(读写函数),怎么判断读到这个文件结尾。具体的说:1...转载 2019-07-11 09:13:16 · 4985 阅读 · 3 评论 -
C陷阱篇之常见手误
C的某些语法容易让人不小心触雷,比如从0开始的下标很多高级语言中,定义n个元素的数组,下标范围是从1到n,但C特殊,n元素的C数组中没有下标为n的元素,只有从0到n-1的下标。所以使用C数组时不要犯这种错误:int i, a[10];for ( i = 1; i <= 10 ; i++ ) {a[i] = 0;}//i=10时超出数组边界八进制or十...转载 2019-07-10 14:04:12 · 424 阅读 · 0 评论 -
头文件包含的合理顺序
如果包含顺序不当,可能出现包含顺序依赖问题,甚至引起编译错误。推荐如下顺序:在头文件中:(1)包含当前工程中所需要的自定义头文件(顺序自定);(2)包含第三方程序库的头文件;(3)包含标准头文件。在源文件中:(1)包含该源文件对应的头文件(如果存在);(2)包含当前工程所需要的自定义头文件;(3)包含第三方程序库的头文件;(4)包含标准头文件。...转载 2019-07-04 16:51:42 · 3741 阅读 · 0 评论 -
可变参数宏 及 可变参数函数
1.#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).#incldue <stdio.h>#define PSQR(x) printf("the square of" #x "is ...转载 2019-07-13 13:51:10 · 2675 阅读 · 0 评论 -
getch(),getche(),getchar()
先说基本区别。(1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符。其调用格式为: getch(); getche(); 两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()函数却将读入的字符回显到显示屏幕上。 例1: #include<stdio.h>...转载 2019-07-03 10:43:30 · 587 阅读 · 0 评论 -
插入排序和选择排序c程序-纯代码
// #include<stdio.h>#include<windows.h>#define SWAMP(a,b) (a)+=(b),(b)=(a)-(b),(a)-=(b)void SwampTwoInt(int *a,int *b){ int temp=*a; *a=*b; *b=temp;}void Choos...原创 2018-07-09 15:32:23 · 354 阅读 · 0 评论