近期学习鸿蒙硬件物联网开发,用到的开发语言是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. IDA反汇编EXE添加一个启动时的消息框

    IDA反汇编EXE添加一个启动时的消息框 上一篇文章介绍了用OD反汇编EXE添加一个启动时的消息框,这篇文章也是实现同样的效果,这边主要的思路还是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转 ...

  2. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  3. 小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!

    大家好,我是冰河~~ 由于在更新其他专题的文章,Spring系列文章有很长一段时间没有更新了,很多小伙伴都在公众号后台留言或者直接私信我微信催更Spring系列文章. 看来是要继续更新Spring文章 ...

  4. WordPress安全篇(1):WordPress网站启用HTTPS详细教程

    以前我们浏览网页使用的都是HTTP协议,HTTP使用明文传输,所以传输过程中很容易遭受黑客窃取.篡改数据,很不安全.在WordPress网站上启用HTTPS协议访问后,能大大提升站点的安全性,启用HT ...

  5. Java on Visual Studio Code的更新 – 2021年5月

    杨尧今 from Microsoft VS Code Java Team 欢迎来到 5月的 VS Code for Java 更新.这次,我们将与您分享Java格式化设置编辑器和其他很酷的功能.开始吧 ...

  6. JVM调优的反思与总结

    垃圾回收的悖论 所谓"成也萧何败萧何".Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK ...

  7. Linux Oracle 中文乱码解决

    1.Linux操作系统Oracle11g设置别名的时候发现中文乱码 2.直接修改环境变量 添加 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 3.执行命令使环境变 ...

  8. CosId 1.0.0 发布,通用、灵活、高性能的分布式 ID 生成器

    CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...

  9. Swagger/OpenAPI By Swashbuckle在NetCore 3.1中较NetCore 2.2使用的注意事项及入门

    方案选择 使用Web API时,了解其各种方法对开发人员来说可能是一项挑战. Swagger也称为OpenAPI(Open Application Programming Interface,开放应用 ...

  10. 使用A Star 算法实现自动寻路详解

    @ 目录 1.什么是A Start算法 2.A Star算法的原理和流程 2.1 前提 2.1.1 从起点开始扩散的节点 2.1.2 最短距离计算公式:F = G + H 2.1.3 欧几里得距离计算 ...