当前位置:网站首页>C语言基础
C语言基础
2022-07-25 09:23:00 【工作使我快乐】
前言
对工作中使用到的C语言语法进行整理,部分内容来自参考博文。
不是专业从事软件行业,代码仅是基础能够满足功能需求。后期不断更新和丰富内容吧。
1 语法
1.1 结构体
->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”
struct Data
{
int a,b,c;
}; /*定义结构体*/
struct Data * p;/*定义结构体指针*/
struct Data A = {1,2,3};/*声明变量A*/
int x;/*声明一个变量x*/
p = &A ; /*让p指向A*/
x = p->a;/*这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x*/
/*由于此时p指向A,因而 p->a == A.a,也就是1*/
对于一开始的问题 p = p->next;这应该出现在C语言的链表,这里的next应该是一个与p同类型的结构体指针,其定义格式应该是:
struct Data
{
int a;
struct Data * next;
};/*定义结构体*/
…………
main()
{
struct Data * p;/*声明指针变量p*/
……
p = p->next;/*将next中的值赋给p*/
}

1.2 寄存器单bit操作
将32bit位宽的寄存器GPIOx_CRL某一bit (第n bit , n 从0起始)置1,采取方法:
GPIOx_CRL = GPIOx_CRL | (0x01 << n) //n从0开始
GPIOx_CRL = GPIOx_CRL | (0x01 << 0) //将GPIOx_CRL[0]置1
GPIOx_CRL = GPIOx_CRL | (0x01 << 3) //将GPIOx_CRL[3]置1将32bit位宽的寄存器GPIOx_CRL某一bit (第n bit , n 从0起始)置0,采取方法:
GPIOx_CRL = GPIOx_CRL & (~(1 << n)) /* 清零第n bit位 */
//解析,若GPIOx_CRL = 1001 1111,n=2,
(1<<2) 得二进制数:0000 0100
取反是:1111 1011
GPIOx_CRL = (1001 1111) & (1111 1011) = 1001 10111.3 寄存器多bit赋值
将32bit位宽的寄存器GPIOx_CRL中的bit[6:2]赋值一个新的数值,则需要首先将该bit[6:2]清零,其次赋值即可。步骤如下:
//参考代码--------------------------------------------------------
//首先,将GPIOx_CRL[6:2]清零。清零几bit就将几bit的1左移后取反、然后与原寄存器值 “相与”
GPIOx_CRL = GPIOx_CRL & (~(0x1f << 2)) /* 清零第[6:2] bit位 */
//其次,将GPIOx_CRL[6:2]赋新值"0xd" ,只需将新值左移后、与原值“相或”
GPIOx_CRL = GPIOx_CRL | (0xd << 2)
//代码解析--------------------------------------------------------
//若GPIOx_CRL = 1001 1111,清零步骤如下:
(0x1f<<2) 得二进制数:0111 1100
取反是 :1000 0011
GPIOx_CRL = (1001 1111) & (1000 0011) = 1000 0011
//赋值
0xd 二进制是 :1101
(0xd << 2)是 :110100
GPIOx_CRL = GPIOx_CRL | (0xd << 2) = 1000 0011 | 11 0100 =1011 0111
举例,将下面寄存器bit0置1,可以将该寄存器所有功能段做好声明定义,然后使用下面方式
GPIOx_CRL = GPIOx_CRL | (0x01 << BLOCK_COUNT_ENABLE) //将GPIOx_CRL.BLOCK_COUNT_ENABLE置1这里需要注意,上面操作的是寄存器中的BLOCK_COUNT_ENABLE的位宽是1bit
如果需要对AUTO_CMD_ENABLE修改其值,比如这2bit原数值是0x3,如果需要修改成0x1,下面的这种表达方式可能存在问题
GPIOx_CRL = GPIOx_CRL | (0x01 << AUTO_CMD_ENABLE) //因此,如果需要对寄存器中某几bit字段赋值,可以考虑先将这几bit清零,之后再赋值即可。

例如,需要设置第0位bit=1时,不能简单的设置为:GPIOx_CRL=0x01 ,这样的方法会使得低配置寄存器GPIOx_CRL的其它比特位都置为0。
对于二进制位操作来说:
不管该位原来的值是0还是1,它跟0进行&运算,得到的结果都是0,而跟1进行&运算,将保持原来的值不变;
不管该位原来的值是0还是1,它跟1进行|运算,得到的结果都是1,而跟0进行|运算,将保持原来的值不变。

常用语法
1、if else语法
if(age>=18){
printf("恭喜,你已经成年,可以使用该软件!\n");
}else{
printf("抱歉,你还未成年,不宜使用该软件!\n");
}
2、while语法
#include <stdio.h>
int main(void){
int i,sum=0;
i=1;
while(i<=100){
sum=sum+i;
i++;
}
printf("%d\n",sum);
return 0;
}
#include <stdio.h>
int main(void){
int n=0;
printf("input a string:\n");
while(getchar()!='\n') n++;
printf("%d",n);
return 0;
}
3、函数定义和使用


参考
| 1、作者 | 博文 |
| 【转】C语言中 -> 是什么意思? | |
| C语言位操作 - bit 、byte的清零,置1,提取,判断 | |
| C语言对寄存器的位操作 |
边栏推荐
- ARMv8通用定时器简介
- Raspberry sect door ban system based on face recognition
- First knowledge of opencv4.x --- image histogram matching
- 【机器翻译】SCONES——用多标签任务做机器翻译
- CUDA 解释 - 深度学习为何使用 GPU
- expect+sh实现自动交互
- TensorFlow raw_rnn - 实现seq2seq模式中将上一时刻的输出作为下一时刻的输入
- 【Tensorflow2安装】Tensorflow2.3-CPU安装避坑指南!!!
- 缺陷检测网络--混合监督(kolektor缺陷数据集复现)
- 【深度学习】卷积神经网络
猜你喜欢

Yolov5 realizes target detection of small data sets -- kolektor defect data set

*6-3 save small experts

初识Opencv4.X----为图像添加高斯噪声

Creation of adjacency table of undirected connected graph output breadth depth traversal

CCF 201503-4 网络延时

基于树莓派4b的传感器数据可视化实现

AMD EPYC 9664旗舰规格曝光:96核192线程 480MB缓存 3.8GHz频率

Mixed supervision for surface-defect detection: from weakly to fully supervised learning:表面缺陷检测的混合监督

ARMv8通用定时器简介

【深度学习】卷积神经网络
随机推荐
Creation of adjacency table of undirected connected graph output breadth depth traversal
初识Opencv4.X----图像直方图匹配
Surfaceview flash screen (black problem)
初识Opencv4.X----方框滤波
Customize dialog to realize the pop-up box of privacy clause statement imitating Netease cloud music
深度估计自监督模型monodepth2在自己数据集的实战——单卡/多卡训练、推理、Onnx转换和量化指标评估
[code source] daily one question non decreasing 01 sequence
Save pdf2image PDF file as JPG nodejs implementation
Customize the view to realize the background of redeeming lottery tickets [elementary]
初识Opencv4.X----图像模板匹配
Prim minimum spanning tree (diagram)
A number converted from a decimal integer to another base
CUDA 解释 - 深度学习为何使用 GPU
CCF 201604-2 俄罗斯方块
深度学习 段错误(Segment Core/ Exit code 139)情况记录
First knowledge of opencv4.x --- image convolution
*7-1 CCF 2015-09-1 sequence segmentation
Kotlin collaboration: foundation and use of collaboration
CDA LEVELⅠ2021新版模拟题一(附答案)
Binary Cross Entropy真的适合多标签分类吗?