近期学习鸿蒙硬件物联网开发,用到的开发语言是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. 谈谈stream的运行原理

    害,别误会,我这里说的stream不是流式编程,不是大数据处理框架.我这里说的是stream指的是jdk中的一个开发工具包stream. 该工具包在jdk8中出现,可以说已经是冷饭了,为何还要你说?只 ...

  2. CentOS 30分钟部署 .net core 在线客服系统

    前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程.期间有一些朋友希望能够给出 Linux 环境的安装部署指导,本文基于 CentOS 8.3 来安装部署.在本文中我 ...

  3. 基于Typescript的Vue项目配置国际化

    基于Typescript的Vue项目配置国际化 简介 使用vue-i18n插件对基于Typescript的vue项目配置国际化,切换多种语言, 配合element-ui或者其他UI库 本文以配置中英文 ...

  4. Java显式锁

    Java 显式锁. 一.显式锁 什么是显式锁? 由自己手动获取锁,然后手动释放的锁. 有了 synchronized(内置锁) 为什么还要 Lock(显示锁)? 使用 synchronized 关键字 ...

  5. 2.docker下centos镜像

    1.下载并运行 # 交互模式下载并运行centos容器 $ docker run -it centos:latest /bin/bash 1.1 配置centos的环境别名 $ vi /etc/bas ...

  6. DHCP原理与配置

    一.DHCP应用场景 DHCP服务器能够为大量主机分配lp地址,并能够集中管理 二.DHCP报文类型 微软操作系统的DHCP服务是四个广播报文 三.地址池 主机-------------------- ...

  7. Mysql 面试题(一网打尽,收藏版)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  8. 「Spring Boot架构」集成Mybatis-Plus的实例详解

    MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 特性 无侵入:只做增强不做改变,引入它不会对现有工程 ...

  9. 一次SQL查询优化原理分析(900W+数据,从17s到300ms)

    有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: ...

  10. 对ES6中类class以及实例对象、原型对象、原型链之间关系的详细总结

    1. 类 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后用这个类来实例化对象.即类的用途:实例化对象. // 创建一个Person类 class Person { } // ...