C语言基础

前言

对工作中使用到的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)    //将1左移n位,n从0开始
GPIOx_CRL = GPIOx_CRL | (0x01 << 0)    //将1左移0位,将GPIOx_CRL[0]置1
GPIOx_CRL = GPIOx_CRL | (0x01 << 3)    //将1左移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 1011

1.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语言对寄存器的位操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值