近期学习鸿蒙硬件物联网开发,用到的开发语言是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. Pandas高级教程之:category数据类型

    目录 简介 创建category 使用Series创建 使用DF创建 创建控制 转换为原始类型 categories的操作 获取category的属性 重命名categories 使用add_cate ...

  2. 大型情感类技术连续剧-徒手撸一个 uTools(二)

    前言 上篇手把手教你实现一个支持插件化的 uTools 工具箱我们介绍过了如何通过 electron 实现 utools 的插件功能体系,并按照 utools 的交互和设计做出了一套可以支持插件化的桌 ...

  3. gitlab 设置分支保护功能及取消分支保护

      使用gitlab管理员账户登录gitlab系统 进入需要分支保护的项目 进行分支保护设置 保护开发分支策略配置 保护RC送测库分支策略配置 调整分支保护策略 效果展示 取消分支保护 效果展示

  4. Docker_CICD笔记

    1 环境说明 1.1 机器配置 主机名称 IP地址 系统版本/内存/cpu核数/硬盘 安装软件 controlnode 172.16.1.70/24 centos7.4/4/2/60 docker.d ...

  5. 29、Tomcat只允许指定域名访问,禁用IP地址访问,防止恶意解析

    1.1.测试环境说明: Linux版本:7.6 IP地址:10.11.220.123/24 Tomcat版本:tomcat-8.5.37(端口号为8080) Jdk版本:1.8.0_202 1.2.配 ...

  6. 8、linux常用命令

    8.1.pwd: 显示当前的路径: -L:显示逻辑路径,即快捷方式的路径(默认的参数): -P :显示物理路径,真实的路径: 8.2.man: 命令的查看: 8.3.help: 命令的查看: 8.4. ...

  7. js 对json数据进行检索 插件 linq.js

    有时界面需要很多数据.但是多次访问服务器效率很低,所以需要检索json数据,最好是像sql查询语句那种 linq.js 插件 LINQ,语言集成查询(Language Integrated Query ...

  8. 徒手从零实现 uTools 系列(三)- 屏幕取色和截屏

    前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...

  9. Linux:linux服务器稳定性压力测试工具stress安装与使用

    stress是一个linux下的压力测试工具,专门为那些想要测试自己的系统,完全高负荷和监督这些设备运行的用户. 1. stress1.0.4下载地址 下载:https://fossies.org/l ...

  10. Docker:Docker部署postgresql数据库

    环境 Centos-7  Postgresql-10 docker-19 yum加载Postgresql yum install https://download.postgresql.org/pub ...