近期学习鸿蒙硬件物联网开发,用到的开发语言是C;

一、基础语法:第一个案例: 命令 gcc hello.c
#include <stdio.h>  //stdio.h 是一个头文件 , #include 是一个预处理命令,用来引入头文件
void func2(){
printf("C语言小白变怪兽"); //打印函数是printf();
}
void func1(){
printf("http://c.biancheng.net\t\n");
func2();
} int main(){ // 代码从 main() 函数开始执行
func1(); //调用函数
return 0;
}
如果是多个 c 代码的源码文件,编译方法如下:
$ gcc test1.c test2.c -o main.out
1、标识符:
    1、C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
    2、C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Manpower 和 manpower 是两个不同的标识符
2、关键字
关键字
下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
    关键字 说明
    auto    声明自动变量
    break   跳出当前循环
    case    开关语句分支
    char    声明字符型变量或函数返回值类型
    const   定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变
    continue    结束当前循环,开始下一轮循环
    default 开关语句中的"其它"分支
    do  循环语句的循环体
    double  声明双精度浮点型变量或函数返回值类型
    else    条件语句否定分支(与 if 连用)
    enum    声明枚举类型
    extern  声明变量或函数是在其它文件或本文件的其他位置定义
    float   声明浮点型变量或函数返回值类型
    for 一种循环语句
    goto    无条件跳转语句
    if  条件语句
    int 声明整型变量或函数
    long    声明长整型变量或函数返回值类型
    register    声明寄存器变量
    return  子程序返回语句(可以带参数,也可不带参数)
    short   声明短整型变量或函数
    signed  声明有符号类型变量或函数
    sizeof  计算数据类型或变量长度(即所占字节数)
    static  声明静态变量
    struct  声明结构体类型
    switch  用于开关语句
    typedef 用以给数据类型取别名
    unsigned    声明无符号类型变量或函数
    union   声明共用体类型
    void    声明函数无返回值或无参数,声明无类型指针
    volatile    说明变量在程序执行中可被隐含地改变
    while   循环语句的循环条件
3、C语言数据类型的分类方式如下:基本类型和枚举类型,统称算术类型
    基本类型:1、标准整数类型,以及扩充的整数类型
                类型          存储大小    值范围
                char            1 字节    -128 到 127 或 0 到 255
                unsigned char   1 字节    0 到 255
                signed char     1 字节       -128 到 127
                int             4 字节    -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
                unsigned int    2 或 4 字节    0 到 65,535 或 0 到 4,294,967,295
                short           2 字节    -32,768 到 32,767
                unsigned short  2 字节    0 到 65,535
                long            4 字节    -2,147,483,648 到 2,147,483,647
                unsigned long   4 字节    0 到 4,294,967,295
              2、 实数浮点类型,以及复数浮点类型
                 类型             存储大小    值范围               精度
                float               4 字节    1.2E-38 到 3.4E+38       6 位小数
                double              8 字节    2.3E-308 到 1.7E+308 15 位小数
                long double         16 字节   3.4E-4932 到 1.1E+4932   19 位小数
    枚举类型:enum:(typedef)用以给数据类型取别名
            typedef enum {
                /** Operation completed successfully */
                osOK                      =  0,
                /** Unspecified error */
                osError                   = -1,
                /** Timeout */
                osErrorTimeout            = -2,
                /** Resource error */
                osErrorResource           = -3,
                /** Incorrect parameter */
                osErrorParameter          = -4,
                /** Insufficient memory */
                osErrorNoMemory           = -5,
                /** Service interruption */
                osErrorISR                = -6,
                /** Reserved. It is used to prevent the compiler from optimizing enumerations. */
                osStatusReserved          = 0x7FFFFFFF
            } osStatus_t;
    void类型:   
                  序号                 类型与描述
                  1                 函数返回为空:不返回值的函数。例如 void exit (int status);
                  2                 函数参数为空:int rand(void);
                  3                 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。
                                    例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。
    派生类型包含:
    指针类型:指针是表示内存地址的一个变量类型;【数据在内存中的地址也称为指针,如果一个变量存储了一 份数据的指针,我们就称它为指针变量。】
        案例:个变量前面都要带*  int *a,*b;
        #include <stdio.h>
        int main(){
            int a=15,b=99,c=222;
            int *p = &a;  //&a表示取变量 a 的地址
            *p = b;
            c= *p;//*p表示取得 p 指向的数据
            printf("%d, %d, %d, %d\n", a, b, c, *p);
            return 0;
        }
        对星号*的总结:
        在我们目前所学到的语法中,星号*主要有三种用途:
          1、表示乘法,例如int a = 3, b = 5, c;  c = a * b;,这是最容易理解的。
          2、表示定义一个指针变量,以和普通变量区分开,例如int a = 100;  int *p = &a;。
          3、表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a;    *p = 100;  b = *p;。
 
    结构类型:结构类型是在程序中定义的类型,以指定记录的格式,它包括成员名称和类型,以及成员在内存中的存储次序;
    案例:struct [标签名称] {成员声明列表}
    struct Song { 
              char title[64];
              char artist[32];
              char composer[32];
              short duration;    // 播放时间(秒)
              struct Date published;     // 出版日期
           };
    联合类型:联合(union)是一种特殊的数据类型,和结构体很像,结构体各成员变量有自己独立的存储位置,而联合的成员变量共享同一片存储区域,因此联合变量再一个时刻只能保存它的某一个成员的值。
    联合的定义和初始化:联合的定义方式与结构体是一样的,只是把关键字 struct 改成 union:
    union [标签名称]
            {
                成员声明列表
            };
    案例:
    union Data 
        { 
            int i; 
            double x; 
            char str[16]; 
        };        
    这种类型的对象可以存储一个整数、一个浮点数或一个短字符串。
    下面的声明定义了一个 union Data 类型的对象 var 和一个 unionData 类型的数组 myData,它有 100 个元素(联合的空间大小为它最大成员的空间大小):union Data var, myData[100];
    获取联合成员值的方式和获取结构体成员的方式一样。但是与结构体不同的是,当改变一个联合成员的值时,实际上修改了该联合所有成员的值。
    union的应用:浮点型转换为4字节整型:
    在串口、IIC、SPI等数据传送时,基本上都是一次传送一个字节的数据,如果我们要传送的是浮点类型的数据呢?常用的方法是将浮点数乘以一个倍数,如10,100,1000,10000等,然后将其转换为整型数据再转化为单个字节进行传送。
    案例:

 #include <stdio.h>
typedef union
{
float fdata; //fdata和ldata共用存储空间
int ldata;
} FloatLongType; //将浮点数f转化为4个字节数据存放在byte[4]中
void Float_to_Byte(float f,unsigned char byte[])
{
FloatLongType fl;
fl.fdata=f;
byte[0]=(unsigned char)fl.ldata;
byte[1]=(unsigned char)(fl.ldata>>8);
byte[2]=(unsigned char)(fl.ldata>>16);
byte[3]=(unsigned char)(fl.ldata>>24);
} //将4个字节数据byte[4]转化为浮点数存放在*f中
void Byte_to_Float(float *f,unsigned char byte[])
{
FloatLongType fl;
fl.ldata=0;
fl.ldata=byte[3];
fl.ldata=(fl.ldata<<8)|byte[2];
fl.ldata=(fl.ldata<<8)|byte[1];
fl.ldata=(fl.ldata<<8)|byte[0];
*f=fl.fdata;
} int main()
{
float f=123456.781234; //要转换的浮点数
unsigned char byte[4]= {0}; //转换后的4个字节数据存放的数组 printf("float data=%f\n",f);
//float 转换为 4个字节数据
Float_to_Byte(f,byte);
//输出转换后的4个字节数据
printf("%f to : %x %x %x %x \n", f, byte[0], byte[1], byte[2], byte[3]);
//把byte的4个字节数据转换为float
Byte_to_Float(&f,byte);
printf("float data=%f\n",f); //输出转换后的结果 return 0;
}

结果:
   float data=123456.781250
   123456.781250 to : 64 20 f1 47
   float data=123456.781250
 
    函数类型:C 语言强调模块化编程,这里所说的模块就是函数,即把每一个独立的功能均抽象为一个函数来实现。
    定义:
    返回类型 函数名 (类型参数1,类型参数2,…)
        {
            函数体
        }

  案例:
#include<stdio.h>
int sum(int m,int n){
int i;
for (i=m+1;i<=n;++i){
m+=i;
}
return m;
} // &a, &b 表示取变量 a,b的地址
//scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。
int main(){
int a,b,total;
int a, b, total;
printf("Input two numbers: ");
scanf("%d %d", &a, &b);
total = sum(a, b);
printf("a=%d, b=%d\n", a, b);
printf("total=%d\n", total);
return 0;
}

C语言学习之基本数据类型【一】的更多相关文章

  1. go语言学习(基本数据类型)

    值类型: int/uint :根据系统确定是32还是64位.此外还有int8/uint8.int16/uint16.int32/uint32.int64/uint64 byte:字节型,相当于uint ...

  2. C语言学习笔记二---数据类型运算符与表达式

    一.C的基本语法单位 1.标识符:有效长度:31(DOS环境下) 2.关键字:main不是 3.分隔符:空格符,制表符,换行符,换页符 4.注释符:a./*.....*/   b.// 二.C的常用输 ...

  3. Go语言学习之数据类型

    ### Go语言学习之数据类型 数据类型的转换 1.Go语言不允许隐式类型转换(显示转换才可以) 2.别名和原有类型也不能进行隐式类型转换 例子: func TestImplicit(t *testi ...

  4. ndk学习之C语言基础复习----基本数据类型、数组

    关于NDK这个分类在N年前就已经创建了,但是一直木有系统的记录其学习过程,当然也没真正学会NDK的技术真谛,所以一直也是自己的一个遗憾,而如今对于Android程序员的要求也是越来越高,对于NDK也是 ...

  5. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】07-基本数据类型

    C语言有丰富的数据类型,因此它很适合用来编写数据库,如DB2.Oracle等大型数据库都是C语言写的.其中,提供了4种最常用的基本数据类型:char.int.float.double,使用这些数据类型 ...

  6. GO学习-(5) Go语言基础之基本数据类型

    Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 基本数据类型 整型 整型 ...

  7. 【C语言】06-基本数据类型

    C语言有丰富的数据类型,因此它很适合用来编写数据库,如DB2.Oracle都是C语言写的. C语言的数据类型大致可以分为下图中的几类: 回到顶部 一.变量 跟其他语言一样,C语言中用变量来存储计算过程 ...

  8. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

随机推荐

  1. P2365 任务安排

    题目描述 n 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 n 个任务被分成若干批,每批包含相邻的若干任务. 从零时刻开始,这些任务被分批加工,第 i 个任务单独完成所需的时间为 ti​ ...

  2. Golang Heap 源码剖析

    堆原理解析 堆一般指二叉堆.是使用完全二叉树这种数据结构构建的一种实际应用.通过它的特性,分为最大堆和最小堆两种. 如上图可知,最小堆就是在这颗二叉树中,任何一个节点的值比其所在子树的任意一个节点都要 ...

  3. 详解 CDN 加速

    背景 本来是为了深入了解 CDN 的,结果发现前置知识:IP.域名.DNS 都还不算特别熟,所以先写了他们 现在终于来聊一聊 CDN 啦 本文素材均出自:https://www.bilibili.co ...

  4. Linux 中使用 QT Charts 显示温度传感器

    前一篇笔记中实现了QT的Label控件显示CPU的温度,只能显示当前的温度,并不能反映CPU温度的变化情况,现在来实现使用QT Charts的曲线图实现一个实时曲线来显示CPU的温度. 添加对Qt C ...

  5. 把 STM32 bluepill 变成调试器(daplink)

    在调一块 ARM M0 内核的板子,使用官方的 DEMO 板子来调,板子上集成了 daplink 调试器. 为了方便使用,我把目标板跟 daplink 剪开了,然后用杜邦线把 daplink 跟目标板 ...

  6. 『动善时』JMeter基础 — 50、使用JMeter测试WebSocket接口

    目录 1.什么是WebSocket接口 2.为什么需要WebSocket 3.测试WebService接口前的准备 4.WebSocket Sampler组件界面详解 5.使用JMeter测试WebS ...

  7. excel自动记录项目完成进度,是否逾期,逾期/提前完成天数,计算天数可以把now()改为today()

    =IF(D38="",NOW()-C38,F38) 注:如果没有启用迭代计算,可以点击"文件"-"选项"-"公式"-&q ...

  8. Redis i/o timeout

    1.背景 公司项目使用国外ucloud云,发现公司业务服务器时常连接redis服务,发生i/o timeout的问题.研发以及服务器侧查看没有异常,反馈给ucolud解决问题.所以这里做一个记录. 2 ...

  9. Pandas高级教程之:plot画图详解

    目录 简介 基础画图 其他图像 bar stacked bar barh Histograms box Area Scatter Hexagonal bin Pie 在画图中处理NaN数据 其他作图工 ...

  10. RabbitMQ交换机

    RabbitMQ中,生产者并不是直接将消息发送给queue,而是先将消息发送给exchange,再由exchange通过不同的路由规则将消息路由到绑定的队列中进行存储,那么为什么要先将消息发送给exc ...