![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言
David 's blog
这个作者很懒,什么都没留下…
展开
-
typedef struct __attribute__((packed, aligned(1)))
1、attribute((packed))的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。2、attribute((aligned(n)))的作用就是告诉编译器在编译过程中按照n字节对齐。常常用来在结构体后面进行修饰。...转载 2020-11-17 20:40:43 · 2774 阅读 · 0 评论 -
【c语言】结构体初始化4中方法
今天在6轴传感器的驱动代码源文件中看到结构体没见过的写法:typedef struct { uint8_t xlda : 1; uint8_t gda : 1; uint8_t tda : 1; uint8_t not_used_01 : 5;} lsm6ds3tr_c_status_reg_t;于是搜了博客,特此转载。以作记录。...转载 2020-08-25 16:49:27 · 596 阅读 · 2 评论 -
【C语言】printf输出16进制: %x %02x %#x
%x即按十六进制输出,英文字母小写,右对齐。%02X有以下变化:英文字母变大写,如果输出字符不足两位的,输出两位宽度,右对齐,空的一位补0。超过两位的,全部输出 printf("%x\n", 47); //输出结果为: 2f printf("%X\n", 47); //输出结果为: 2F printf("%#x\n", 47); //输出结果为: 0x2f printf("%#X\n",47); //输出结果为: 0X2F %#X...原创 2020-07-24 16:17:28 · 29059 阅读 · 0 评论 -
【C语言】enum枚举类型
在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6#define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种...转载 2020-03-06 11:38:14 · 325 阅读 · 0 评论 -
【C语言】宏定义中的##
项目代码中有这么一句,让我看了好久......真的是脑袋秀逗了#define PORT_TASK_INIT(task_name) task_##task_name##_create() ##就是起到了连接的作用。那么再看一些这个宏定义的意义:利用宏,将前一层封装好的函数,直接用。当我们想调用task_logic_create()接口,又要用到task_bat_create()等...原创 2020-03-03 13:08:30 · 850 阅读 · 0 评论 -
指针运算 注意void指针
int arr[] = {1,2,3,4,5,6,7,8,9,10}; int n = sizeof(arr)/sizeof(arr[0]); int *p = arr; int *q = &arr[9]; printf("%d \n",q-p); char abrr[] = {1,2,3,4,5,6,7,8,9,10}; char...原创 2018-10-14 23:26:41 · 907 阅读 · 0 评论 -
字符串转int:处理8,10,16进制以及处理无效字符
字符串转int函数:函数名:Myatoi(*str)功能:将一串字符串转成int整形数字注意事项:1.int型最大取值范围:2147483647,int型占4字节,即4*8 = 32位二进制,整数在二进制中用原码表示即可,第一位为符号位0表示正数,即:01111111 11111111 11111111 11111111,十六进制(HEX)表示为:0fff ffff,十进制计算方法...原创 2018-10-30 15:10:29 · 1052 阅读 · 0 评论 -
static 详解
(1)先来介绍它的第一条也是最重要的一条:隐藏(作用域为当前文件)。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variablevoid msg() { printf("Hello...转载 2018-12-30 22:24:49 · 178 阅读 · 0 评论 -
【读书笔记】关于++i是否线程安全的分析?
(之前春招的笔试题中,看到过很多次++i、原子操作的题,这篇博客就做一个分析。)什么是原子操作?即单指令的操作,单指令操作是不可打断的。再回顾i++和++i:i++和++i都是i=i+1的意思,但是过程有些许区别:i++:先赋值再自加。(例如:i=1;a=1+i++;结果为a=1+1=2,语句执行完后i再进行自加为2)++i:先自加再赋值。(例如:i=1;a=1+++i;结果为...原创 2019-05-07 17:33:01 · 789 阅读 · 0 评论 -
【C语言复习】指针,数组,指针和数组
(本文参考《C和指针》第六章 第八章)《C和指针》第六章主要讲指针的概念和简单用法,对于初学者要仔细看(燃不清地址和值得),对于有c语言基础比较简单;第八章加入了数组,数组和指针,二维数组和指针,相比第六章有进阶,本文重点分析书中几个题。一、第六章指针:概念1.指针是啥?简单说就是地址2.间接访问操作符:*什么是间接访问?间接访问又或者说解引用指针就是:通过一个指...原创 2019-07-23 20:22:54 · 373 阅读 · 0 评论 -
【C语言复习】大小端、求大小端
一、大端模式所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;例子:0000430: e684 6c4e 0100 1800 53ef 0100 0100 00000000440: b484 6c4e 004e ed00 0000 0000 0100 ...原创 2019-07-23 21:16:27 · 214 阅读 · 0 评论 -
内存分区、字符串逆置函数读写发生访问冲入的原因
题目:将一个字符串逆置输出我下写的代码如下:void reserve_string(char *string){ char tmp;//变量tmp用来做交换 char *first_str = string;//字符串的首指针 char *last_str = string;//尾指针 while(*last_str !=...原创 2018-09-13 13:09:17 · 211 阅读 · 0 评论 -
可变参数列表
写一个求平均数的函数,有下面几个方法:方法一:int Avg(int a,int b){ return (a+b)/2;}int Avg(int a,int b,int c){ return (a+b+c)/3;}int Avg(int a,int b,int c,int d){ return (a+b+c+d)/4;}我们发现这样写太麻烦,当求越...原创 2018-09-16 22:45:26 · 131 阅读 · 0 评论 -
函数参数传递:参数传递从右往左
内存分为4个区域,如下:而函数的参数就存放在栈中。栈,先进后出。参数传递方式:a.通过栈 b.从右往左。什么是从右往左呢?来举个例子。int Max(int a,int b);Max函数有两个参数a和b。这两个参数怎么存放在栈中呢?从右往左,即先从b,然后a。读取数据则出栈,先读取a,然后读取b(即先进后出)。 关于这个问题有一个经典挖坑例题。int mai...原创 2018-09-11 23:29:24 · 2086 阅读 · 0 评论 -
正整数求位数and求顺、逆序位数
《c语言程序设计基础》前四章学习完毕,来做一道经典例题。题目要求:给出一个int整形正整数,要求:1.求出它是几位数字 2.按照逆序分别输出每位数字,例如123输出为3213.按正序输出每位数字分析:一:求几位数 设置一个计数器count1234 -> 123 去掉一个4,count+1123 -> 12 去掉一个3,count+112 -> 1 ...原创 2018-05-19 00:37:52 · 461 阅读 · 0 评论 -
scanf 和 printf 的返回值问题
1.关于printf()函数的返回值问题,来看一道例题:int main(){ printf("%d\n",printf("0123")); printf("%d\n",printf("sdd")); printf("%d\n",printf("%d",printf("43"))); return 0;}运行结果:1234sdd34321解析原创 2018-05-15 22:51:31 · 391 阅读 · 0 评论 -
float浮点型数据类型精度问题探究
关于float浮点型数据类型的精度问题,首先,我们举这样一个例子:#include<stdio.h>int main(){ float a = 123456789; printf("%f\n",a); return 0; } 定义一个float浮点型数据类型的a,赋值为123456789,编译后运后,结果却为:123456792.000000为什么会出错,错在哪里呢?想要...原创 2018-05-07 23:16:52 · 2483 阅读 · 0 评论 -
探究整数编码原理。深入理解原码、反码和补码。
先看一个例子:为什么??c = (-100)+(-100的),打印出来的结果为56呢??让我们探究整数的编码之旅吧!一.各种概念各种定义···1.无符号整数,例如unsigned char/int/short 就不介绍了。2.有符号数 char/int的编码:(1)原码:原码表示法是整数的一种简单表示法。符号位:0表示正号,1表示负。数值一般用二进制表示。(2)反码...原创 2018-05-22 22:09:13 · 1526 阅读 · 0 评论 -
c语言课程结束小项目:2048小游戏
《C语言程序设计基础》学习完毕,完成第一个项目:2048小游戏。//思考:编程时,要先想整个框架还是先想每个函数的算法。//思考:每一个函数要不要传参数(即数组)//思考:每一个函数之间的联系是什么,谁调用谁…这里很容易搞得头晕,越想越觉得复杂,便不想完成项目了。将游戏分为几个步骤,拆分来完成每一个函数。一、定义一个4*4的二维数组arr[4][4],初始化为0;二、...原创 2018-07-28 21:34:06 · 3185 阅读 · 0 评论 -
结构体的大小以及sizeof()和strlen()的区别
一:sizeof运算符,可用于任何变量名,类型名或常量值,当用于用于变量名(不是数组名)或常量时,它不需要圆括号。它在编译时起作用,而不是运行时。PS:求结构体的sizeof()大小有两个规则(内存对齐):1.:上一个变量是下一个变量的整数倍。2.:结构体整体的大小是每一个变量的整数倍。例如:struct D{ char a; //1+3...原创 2018-07-26 11:33:06 · 2167 阅读 · 0 评论 -
魔方阵:3阶、4阶、8阶算法与实现
魔方阵:一个N阶魔方阵即N行N列的数组,其每一行的和==每一列的和==对角线的和。例如一个3阶魔方阵:8 1 63 5 74 9 2一:3阶魔方阵这里我们用两种方法实现:方法一:遍历三阶数组的所有条件,将符合条件的(行的和==列的和==对角线和)挑出来。这种方法可以打印出多种情况。方法二:1.将1放在第一行的中间2.后面的数字放在当前数字的的上一行后一列 ...原创 2018-07-21 10:15:59 · 8668 阅读 · 1 评论 -
分析拷贝过程中发生的重叠问题
关于内存重叠问题,我们先来看一道例题:我们在做道题的时候,会发现有多种情况,有前面的部分拷到后面,有后面的部分拷贝到前面,有的部分长,有部分短,有从前往后拷贝,有从后往前拷贝,有内存重叠,也有不重叠······看似复杂无比,其实不然,下面我们来分析所有情况总结规律。所有情况总结一下就是:拷贝方法有两种:a.从前往后拷贝。 ...原创 2018-07-21 19:06:32 · 438 阅读 · 0 评论 -
动态内存分配相关的4个函数: malloc calloc realloc free
一、malloc()参数:分配的字节数引用<stdlib.h>头文件返回一个指针,若内存不足,返回一个空指针。1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。void fr...原创 2018-07-22 15:04:52 · 540 阅读 · 0 评论 -
传指针and解引用
一个函数的改变要影响另一个函数需要两个条件:1、传指针。2、解引用。通过交换a和b数值的实例来说明其重要性:在主函数中输入a和b的值;int a = 10;int b = 20;预期输出结果为a = 20;b = 10。1、明显与预期结果不符。原因:没有传指针!2、具体操作为:也与预期结果不符。原因:没有解引用。3、与预期相符,多测试几组有代表性的数据。...原创 2018-07-22 15:19:46 · 191 阅读 · 0 评论 -
二维数组的参数问题
二维数组作为参数:看这样一个例子:老师之前讲过,二位数组作为参数,写形参为:int (*arr)[][4]主函数中调用该函数:这样写,做了:这样写,错了:这样写,还是错了:这样再写,还是错了:那我加个过好,再写,还错:行,那我补一个[4],恩???还错!??到底怎么才行,我就不信了。恩,还不行。表达式必须是指向对象的指针类...原创 2018-08-11 14:52:32 · 1234 阅读 · 0 评论 -
辨析 i++和++i
不管是i++或者是++i,都是i自增一。i本身要自己增加1,这个是二者相同的;不同点是,i++或者++i作为右值,左值得情况。例如a = i++;//i在前,则a先使用i的值。 a = ++i;//++在前,则a先使用i自增1的值。 下面看例题代码: ...原创 2018-05-22 19:32:18 · 214 阅读 · 0 评论