近期学习鸿蒙硬件物联网开发,用到的开发语言是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. MySQL慢查询日志如何开启以及分析

    1.MySQL慢查询日志是什么 (1)MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录MySQL中查询时间超过(大于)设置阈值(long_query_time)的语句,记录到慢查询日志 ...

  2. 【NX二次开发】Block UI 多行字符串

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  3. 【VBA】字符串处理

    InStr 函数:查找字符串 1 Sub InStr函数() 2 Dim strTemp As String 3 strTemp = "=AAA=BBB=C" 4 Debug.Pr ...

  4. Mysql优化_第十三篇(HashJoin篇)

    Mysql优化_第十三篇(HashJoin篇) 目录 Mysql优化_第十三篇(HashJoin篇) 1 适用场景 纯等值查询,不能使用索引 等值查询,使用到索引 多个join条件中至少包含一个等值查 ...

  5. Jmeter将token设置为全局变量并跨线程进行传递参数

    我们在用Jmeter做性能测试时,一般会涉及到多个线程组.而线程之间或接口之间会对上个参数有依赖性,那么我们将接口中的参数提取出来供其他线程组或接口调用呢这就需要使用到__setProperty函数, ...

  6. 快速串讲——JVM内存的区域划分

    目的 快速定位JVM内存泄漏或者溢出等问题. 面试基础题,加分项. 文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍. 程序计数器(Progra ...

  7. NAT介绍与配置

    一,NAT定义 二.NAT的分类 三,NAT配置实验 一,NAT定义 NAT(Network Address Translation),网络地址转换技术,随着Internet的发展,IPv4地址枯竭已 ...

  8. IDEA搭建一个SpringBoot项目——十分详细(web+mysql)

    ​前排提示: IDEA版本:IntelliJ IDEA 2021.1.1 专业版(是否为专业版影响不大) 搭建目的:前端web页面能够获取到MySQL数据库中的数据 详细步骤: 1. 创建一个新项目 ...

  9. 44、wget和curl的常用参数

    1.wget: wget是文件下载的工具: 不加任何参数是直接下载该文件: (1)-O: 将下载的文件指定为特定的文件名: wget -O baidu.html www.baidu.com --201 ...

  10. 【PC桌面软件的末日,手机移动端App称王】写在windows11支持安卓,macOS支持ios,龙芯支持x86和arm指令翻译

    面对这场突如其来的变革,作为软件开发者,应该如何选择自己今后的发展方向?桌面软件开发领域还有前景吗? 起源 自从苹果发布m1处理器,让自家Mac支持IOS移动端app运行之后,彻底打破了移动端app和 ...