vlambda博客
学习文章列表

你对c语言够了解吗?

点击蓝字
默默关注


前面一段时间主要分享了Java层的逆向分析,也分享的也差不多了。


现在要给大家分享的是Android NDK开发及相关的内容的知识,掌握Java层与Native层之间是如何进行通信的。


通过对C语言的了解,能够编写简单的C代码,并且能够将.c文件编译成可执行程序,放在Android设备上运行。


通过JNI接口可以实现Java层与底层C/C++函数进行相互调用。掌握JNI静态注册和JNI动态注册,为后面的ARM汇编、IDA分析奠定基础。





C语言的诞生是现代程序语言革命的起点。今天C语言依旧在系统编程、嵌入式编程等领域占据着统治地位。C语言由丹尼斯.里奇开发,被称为C语言之父。


你对c语言够了解吗?

C语言之父


1
 C/C++概念:当代最优秀的程序设计语言


C/C++是当代最优秀的程序设计语言。C语言是C++的基础,C++和C语言在很多方面是兼容的。


C语言是一个结构化语言,它的重点在于算法与数据结构。C语言用于嵌入式开发和程序结构优化。C++首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。


所以C语言和C++的最大区别在于它们解决问题的思想方法不一样。


因为在后面的学习当中用到的都是C语言的内容,所以C++这部分内容不做过多讲解,感兴趣的可以课后去了解下C++语言。



2
C的令牌


C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。

例如:

    #include <stdio.h> 

    int main()

    

       /* 我的第一个 C 程序 */ 

       printf("Hello World! \n"); 

       return 0

    }


在这里需要强调的是分号(“;”),在 C 程序中分号是语句结束符,跟汉语言里的句号(“。”)一个概念。它表明一个逻辑实体的结束,每个语句必须以分号结束。



3
 注释


C语言有两种注释,分别是:


第一种:以“//”格式开始的是单行注释,这种注释可以单独占一行。


第二种:以“/* */”格式的注释可以注释单行或多行。



4
标识符


C标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母A-Z或a-z或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。


C标识符内不允许出现关键字及特殊字符,比如@、$和%。C是区分大小写的编程语言。因此,在C语言中Manpower和manpower是两个不同的标识符。


下表已列出10个有效的标识符:


你对c语言够了解吗?



5
关键字


下表列出了C中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。


你对c语言够了解吗?



6
C指针


探究:什么是指针 ?



指针变量声明的一般形式为:type *yijindaxue;


type 是指针的基类型,它必须是一个有效的C数据类型,yijindaxue是指针变量的名称,星号*用来声明指针,与乘法中使用的星号是相同的。但是,在这个语句中星号*是用来指定一个变量是指针。


下表是有效的指针声明:  


你对c语言够了解吗?



实例:


你对c语言够了解吗?


探究:实例中#include <stdio.h> 是什么?


扩展名为.h的文件是头文件,它包含C函数声明和宏定义,能被多个源文件引用共享。头文件包含两种类型,一种是程序员编写的头文件,另一种是编译器自带的头文件。在程序中要使用头文件,需要使用C预处理指令#include来引用,stdio.h头文件,它是编译器自带的头文件。



7
结构体


1.结构体类型

结构体是一种构造类型,它由若干成员组成。其中每一个成员都可以是一个基本数据类型,或者是一个构造类型。


声明结构体时使用的关键字是struct,声明一种结构体的一般形式为:

       struct 结构体名

       {

            成员列表

       }变量名列表;


关键字struct表示声明结构体,其后的结构体名表示该结构的类型名,大括号中的变量构成结构的成员,也就是一般形式中的成员列表。

例如:

        struct date

       {

            int year;//年

            int month;//月

            int day;//日

       };


2.结构体变量

声明一个结构体相当于创建一种类型名,要使用新的类型名就要进行定义变量,定义的方式如下3种方式:

(1)先声明结构体类型,再定义变量

例如:struct date date1; date是结构体类型,date1是变量名。


(2)在声明结构类型时,同时定义变量

例如:

      struct date

      {

            int year;//年

            int month;//月 

            int day;//日 

      }date1;


(3)直接定义结构体类型变量

例如:

      struct

      {

            int year;//年

            int month;//月 

            int day;//日 

      }date1;


类型和变量不同。只能对变量进行赋值操作,而不能对一个类型进行操作。


3.结构体变量的引用

对结构体变量进行赋值、存取或运算,实质上是对结构体成员的操作。

结构体变量成员的一般形式是:结构体变量名.成员名。

例如:

date1.year=2020;

date1.month=1;


4.结构体类型的初始化   

结构体类型和其它基本类型一样,也可以在定义结构体变量时指定初始化值。

例如:

      struct date

      {

            int year;//年

            int month;//月 

            int day;//日 

      }date1={2020,1,20};


5.完整的实例代码如下所示:


你对c语言够了解吗?



8
共用体


共用体把几种不同类型的变量存放到同一段内存单元中,所以共用体在同一时刻只能有一个值,它属于某一个数据成员。由于所有成员存放在同一个内存中,因此,共用体的大小等于最大成员的大小。   

定义共用体的类型变量的一般形式为:


      union 共用体

      {

            成员列表

      }变量列表;


例如:

      union data  //定义共用体 

      {

            int num; //4byte 

            char ch; //1byte 

            float temp; //4byte 

      }data1;



1.引用共用体变量

共用体变量定义完成后,就可以引用其中的成员数据进行使用。

引用的一般形式为:共用体变量.成员名;   

例如:

      data1.num;

      data1.ch;


2.共用体变量初始化

在定义共用体变量时,可以同时对变量进行初始化操作,初始化的值放在一对大括号中。

完整实例代码如下所示:



3.共用体类型的数据特点

同一个内存段可以用来存放几种不同类型的成员,但每次只能存放其中的一种类型,而不是同时存放所有的类型。共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后,原有的成员就会失去作用。



结构体和共用体的区别:结构体是定义一个由多个数据成员组成的特殊类型,而共用体是定义一块为所有数据成员共享的内存。



9
文件操作


文件(File)是指一组相关数据的有序集合。 


所有文件都是通过流进行输入、输出操作的。流是一个数据字节的序列,流入程序的流称为输入流;相对地,流出程序的流称为输出流。  


  • 流==>(文本流、二进制流) //二进制流 010101。

  • 文件==>(文本文件(ASCII)、二进制文件)。

  • 文件内容==>(源文件、目标文件、可执行文件、头文件、数据文件等)。

  • 普通文件:指驻留在磁盘或其他外部介质上的一个有序集合。

  • 设备文件:指与主机相连的各种外部设备,如显示器、打印机、键盘。


1.文件基本操作

文件基本操作包括文件的打开和关闭,除了标准的输入、输出文件外,其它所有的文件都必须先打开,再使用,使用结束后,必须关闭该文件。

(1)打开文件   

  

   FILE* fopen(FILE* p,char* mode),

   打开文件的操作就是创建一个流 。    


(2)关闭文件

int fclose(FILE* p);调用fclose函数时会返回一个int值,当正常完成关闭文件操作时,返回值为0,否则返回EOF。


2.文件指针

文件指针是一个指向文件有关信息的指针,他们保存在一个结构体变量中。


3.文件结构体

typedef struct

{

short level;         //缓存区的使用量 

unsigned flags;      //标志文件状态 

char fd;               //文件号    

unsigned char hold;//无缓存区取消字符输入

short bsize;           //缓存区大小 

unsigned char *buffer; //缓存区指针  

unsigned ar* curp;     //无活动指针

unsigned istemp;       //草稿文件标识 

short token;           //做正确性检测 

}FILE;


4.文件读写操作

  • 打开文件后,即可对文件进行读取和写入的操作。

  • fputc(字符,文件类型指针); 写字符函数

  • fgetc(文件类型指针); 读字符函数

  • fputs(字符串,文件类型指针);写字符串函数

  • fgets(字符数组,n,文件类型指针); 读字符串函数

  • fprintf(文件类型指针,格式字符串,输出列表); 格式化写入函数

  • fscanf(文件类型指针,格式字符串,输入列表); 格式化读取函数

  • fread(buffer,size,count,fp);  数据块读函数

  • fwrite(buffer,size,count,fp); 数据块写函数


5.定位文件

读写文件中的数据时,根据位置指针的位置来确定读写数据在文件中的位置。而所谓的的文件定位,是要能够根据读写要求移动文件内部读写位置指针。


  • fseek(文件类型指针,位移量,起始点):随机读写函数。

  • int rewind(文件类型指针:将文件指针重新指向一个流的开头。

  • long ftell(文件类型指针):返回当前文件指针。



10
小结


本次主要分享了C语言,对整个体系进行简单的介绍,需要掌握基本数据类型、指针、还有结构体与共用体以及文件操作常用函数。


文章推荐