- 博客(18)
- 收藏
- 关注
原创 c语言的一些高级用法
内存的存储规则要求,int型因为是4个字节,所以它存储的起始位置必须能被4整除,char型1个字节,能被1整除就行了,又因为要保证下一个创建的结构体的int起始位置也满足要求,所以一个结构体占用内存要是4的倍数,所以此结构体占用内存为1000 1111 1000,1为占用内存,0为空占位,而如果是struct AX{int a;则内存是1111 1 1 00,共占用8个字节空间,虽然还有两个浪费,但利用率大幅提高。最近在看《c和指针》,每天会更新一些,如有错误望指正。
2024-09-09 22:15:51 183
原创 c语言的一些高级用法
或struct{int a;或struct ST{int a;或typedef struct{int a;像这样的结构体嵌套结构体,可以用exa.sa[1].a来逐级访问。如果函数的参数是指向结构体的指针,那么(*cp).f和cp->f是一样的,箭头本质就是为了简写指针。结构体的成员不能有自己,因为这样会无限循环,但是可以有自己的指针。
2024-09-08 22:41:56 232
原创 c语言的一些高级用法
char *str[10]实际就是个二维数组,他是对数组进行间接访问得到char,所以str[0]就是个地址,那么str就是地址的地址,所以可以访问str[1][2]。在使用strcpy进行字符串复制的时候,源数组比目的数组短是可以的,他会把目的数组的结尾加'\0',所以多余的地方也视为被删除了,是垃圾内存。x-y虽然等于-1,但是用if判定时,结果是大于0的,因为(x-y)也是unsigned int 型的,使用(int)(x-y)就好了。char a[10]="asd",所有的空位都被'\0'填充。
2024-09-07 22:05:57 231
原创 c语言的一些高级用法
这也很好理解,二维数组a[][]相当于**p,*a就相当于*p,对地址只进行一次解码,解出来的是第一行的首地址,*(a+1)就是第二行的首地址,*(a+1)+1就是在第二行首地址的基础上,再往后移动一个元素,这是二维数组的第一行的元素就是普通的int变量,如果是三维数组,往后移一个就是一个一维数组。这也很好理解,a[0]就相当于*p,a就相当于p,那么a[0]=x,就相当于*p=x,所以a[0]在函数中也能被修改。那么*++b就是a[1][9],再*++b就是a[2][0],按照二维数组的存储顺序访问的。
2024-09-03 22:11:18 329
原创 c语言的一些高级用法
递归函数的调用过程是每次调用函数所制造的形参和局部变量都会入栈,暂时存储在堆栈中,当最内层的函数执行完,开始向外层返回时,最后入栈的变量会被消除,然后形参和局部变量的值就是倒数第二层函数执行时的值,以此类推,最后堆栈中的值将会被不断销毁。能用堆栈暂时储存形参的值,这是递归函数和while的最大区别。注意,这个递归函数在第一次执行的时候,是要等binary_to_ascii(q)执行完了,再执行输出的,它的内层也是如此,这就使得它最终的输出顺序是从内向外的,即为先打印首位,再打印末尾,成功矫正了打印顺序。
2024-08-28 22:11:30 100
原创 c语言的一些高级用法
对初始化为常量的指针,可以*(str1+1)='p',可以*(str1+i)=='a'进行比较,但是不能str1++;也不能*str1=*(str1+1),只能将其先复制到新的指针里,char *str2=str1+1;*copy='\0'.因为两者不是初始化为常量,所以可以对地址赋值,注意在末尾加入终止符,但是最后是无法打印copy的,它只是对str1的复制,只能打印str1。
2024-08-26 22:26:44 192
原创 c语言的一些高级用法
如果其对应于{"abc","def","ghi"},那么就可以将其对应于strings[3][3];*strings对应于首3,也就是3行,**strings对应于尾部的3,也就是3列,那么**strings初始对应于strings[0][0];后,就是strings[0][1](在++将其复制完毕后)也就是'b';那**strings就是字符串,*strings是**strings的地址,所以**strings以'\0'结尾,和字符串的结尾一样,而*strings的结尾是内存地址的结尾,是NULL。
2024-08-24 23:13:18 115
原创 c语言的一些高级用法
指针不初始化是一件很危险的事,未初始化将随机给其分配一个地址,这个地址可能是非法的,也可能合法,是一个变量的地址,那你在改变指针的值的时候,那个变量也会被改变,你是很难发现的。int **b=&a;也是合法的,地址a可以再取址,指针b也可以再间接访问。但是可以对a赋值,却不能对&a赋值。间接访问操作*只能作用于指针型,不能作用于整数型,所以*100=25是不对的,可以用*(int *)100=25。最近在看《c和指针》,每天会更新一些,如有错误望指正。空数组的检测结果与0,NULL,'\0'相等。
2024-08-22 21:51:17 162
原创 c语言的一些高级用法
static只改变链接属性为internal,并不改变作用域,局部变量仍然是局部变量,但是会将其存储区由堆栈改为存储器,也就不会重复初始化。有符号数的左右移位是算数移位还是逻辑移位取决于编译器,所以不可移植。无论什么移位都不要移位负数。最近在看《c和指针》,每天会更新一些,如有错误望指正。逗号的作用和分号的作用差不多。
2024-08-21 22:05:09 97
原创 c语言的一些高级用法
源文件里的全局变量的链接属性默认设为外部,所以,不同源文件的同名全局变量可以互相调用,但是不可以重复定义,有且必须只一个定义处,其他地方要用extern声明。非全局变量则不行,不会默认设置链接属性,函数里的局部变量如果与前面的变量同名,会不管之前的变量重新定义一个,但可以使用extern来声明使用的是前面的external型变量。使用sprintf(out,"输出%lld,次数%d",num*num,w);将整数转为字符串,注意num是int64_t,要用%lld,否则后面的w会输出错误。
2024-08-19 19:43:38 145
原创 stm32平衡车
去年寒假就开工了,可困于陀螺仪数据的处理,寒假结束了也没弄出来,今年加入dmp库,又看教程调参,终于算是整出来了,可遗憾的是,加入nrf后,spi和iic的时钟线会冲突,导致两者都无法使用,所以遥控就没能实现。
2024-02-20 10:55:35 471
原创 stm32+oled+编码器+超声波测距=雷达扫描系统
有些bug,也有很多地方可以优化,比如OLED_Cutline用二叉树算法应该效果更好,但是我懒得改了,先这样吧。链接:https://pan.baidu.com/s/1_eccYZEs9K1i1HkJfHaBvw。stm32 雷达系统。
2024-01-21 17:33:09 408
原创 cubemx+mpu6050_dmp+oled
一直想做平衡小车,但是因为mpu的dmp库的hal库的资料不好用,老是搞不定,这个项目就搁置了一年。经过查找一系列的资料,终于能读了,在这就算做一个资料整合,也怕以后又不会用了,留给自己看。
2023-12-09 21:57:43 436
原创 立创eda显示网络标签未与如何引脚相连
昨天用eda画原理图的时候,出现这种情况,明明网络标签都连在引脚上了,结果它还是说“未与任何引脚相连”。检查了一下发现,所有与c8t6相连的标签都是这种情况,其他的则不报错。于是我就换了一个c8t6,结果就解决了。这应该是eda的bug吧。
2022-10-13 12:56:44 7278 8
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人