C语言基础3-WEB安全社区-弘客官方【交流区】-弘客联盟

C语言基础3

结构体

结构体是一种比较特殊的结构

结构体是一些值的集合,这些值被称为成员变量。结构的每个成员变量可以具有不同类型。

定义结构体语法

struct tag//结构体名称

{

    member-list;//成员列表

   

}variable-list;//变量列表(全局变量)

在结构体声明的{}后面创建的变量是全局变量,如果我们只想创建局部变量,就在mian函数里创建。几个名词需要我们额外注意区分一下。

 

结构体(类型)名

struct tag

1

这个叫结构体类型名,或者叫结构体类型,使用上相当于int,char等类型,故叫类型名。

 

结构体成员变量

struct S {

 char a[20];

 char b[5];

 float c;

};

因为{}内部定义的叫成员变量,如例子中a,b,c这样的。定义结构体成员变量也可以顺带初始化。

 

结构体变量名

struct S s = { “abc”, “man”, 3.1415 };

1

在声明好结构体后,用结构体去定义的变量,叫结构体变量,不能和成员变量混淆了。上面的s就是用S创建的变量。定义结构体变量和声明结构体,两种说法是两件完全不同的事情。

 

1.2 结构体的创建

结构体用于描述复杂对象的多个属性,必然具有多个成员变量。结构体成员的类型可以是常量,数组,指针,也可以是其他结构体。结构体类型创建如下列示例:

 

struct book//书

{

 char name[20];//书名

 char author[15];//作者

 float price;//价格

}b1,b2;//全局变量

 

struct point//坐标

{

 int x;

 int y;

};

 

int main()

{

 struct book b;//局部变量

 return 0;

}

我们要访问结构体里面的成员变量

我们就得使用这样的形式

b1.name[]

这样我们就是访问的b1结构体的name数组

 

下面我们来说指针,之前我一直没有提到这个概念,因为指针是c语言的分水岭

学的好的指针就能学过去

指针,可以说是一个相对性的概念,指针的实质意义是一个地址,如果一个指针我们不知道是哪里的地址 那么就毫无意义,所以我才说指针,可以是一个相对性的概念

指针,如果我们知道了一个数据的指针,我通过指针来访问这个数据,比通过数据名来访问数据,会快很多,这也就是指针存在的实际意义

如图所示

d2b5ca33bd160619

 

定义指针

int    *ip;    /* 一个整型的指针 */

double *dp;    /* 一个 double 型的指针 */

float  *fp;    /* 一个浮点型的指针 */

char   *ch;    /* 一个字符型的指针 */

*就是定义指针的操作符

int *p;

p = &a;   //这种方式正确

printf(“p = %d\n”,p);

结果:p = 6618636

变量p存放的a的地址

这里p的值不同的电脑p的值不一样

int p; //这是一个普通的整型变量 

int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 

int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 

int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 

int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与”()”这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 

这是一些特殊形式

指针也可以用来指向一个函数也可以是结构体,也可以是数组(在c++中也可以指向一个对象)

数组与指针

int a[3] = {1, 2, 3};

首先这里我们定义一个数组如果我们定义一个指针p让他指向a[0],对应的值就是1

数组被存储在内存条中是根据下标的顺序依次存储的

所以我们对p的值加上4那么指向的就是a[2](因为整型只占用4字节的内存)

这里不举例子了,有点难理解了

上面我们还说过函数的指针那么函数指针是怎么一回事呢

这里我们只讲理论

当我们定义一个函数的时候

int fun(int x,int y)

这是我们通常的定义方法

我们调用他的时候int *p(int,int)=&fun;

这样操作也是调用的fun函数

所有用上指针的意义都是为了让调用更加快捷

这里还有一个内容叫做二级指针

二级指针说白了就是,对一个指针再做指针(我个人感觉意义不是太大,因为太复杂了,一般我们网安学习c语言是为了逆向分析做逆向分析等)

这里我们再说一些常见的头文件

我们开头的时候说过#include是引用的意思

头文件也是可以由自身定义的,写好的文件后缀名应该是.h

当我们要引用我们自身写好的头文件时,一般情况和源文件(.cpp)是在同一个目录下的

这个时候我们使用#include<>这样的引用方式就不合适了

因为<>表示在本地的c/c++库中寻找头文件

所以我们要换一个引用方式#include””即用双引号来代替<>符号

“”表示在当前目录寻找这个头文件

 

下面我简要介绍一些标准库文件

#include <assert.h>    //设定插入点

#include <ctype.h>     //字符处理

#include <errno.h>     //定义错误码

#include <float.h>     //浮点数处理

#include <fstream.h>    //文件输入/输出

#include <iomanip.h>    //参数化输入/输出

#include <iostream.h>   //数据流输入/输出

#include <limits.h>    //定义各种数据类型最值常量

#include <locale.h>    //定义本地化函数

#include <math.h>     //定义数学函数

#include <stdio.h>     //定义输入/输出函数

#include <stdlib.h>    //定义杂项函数及内存分配函数

#include <string.h>    //字符串处理

#include <strstrea.h>   //基于数组的输入/输出

#include <time.h>     //定义关于时间的函数

#include <wchar.h>     //宽字符处理及输入/输出

#include <wctype.h>    //宽字符分类

头文件 math.h(数学函数库)

数学函数库,一些数学计算的公式的具体实现是放在math.h里

引用方法

 

#include <math.h>

  反余弦 acos

  反正弦 asin

  反正切 atan

  反正切2 atan2

  余弦 cos

  正弦 sin

  正切 tan

 

  双曲余弦 cosh

  双曲正弦 sinh

  双曲正切 tanh

 

  指数函数 exp

  指数分解函数 frexp

  乘积指数函数 fdexp

  自然对数 log

  以10为底的对数 log10

  浮点数分解函数 modf

 

  ***幂函数 pow***

  平方根函数 sqrt

 

  ***求下限接近整数 ceil***

  绝对值 fabs

  求上限接近整数 floor

  求余数 fmod

 

头文件 string.h(字符串处理)

C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,更详细的可以到include文件夹里面查看该文件。

引用方法

 

#include <string.h>

 

//常用函数如下:

strlen求字符串长度

strcmp比较2个字符串是否一样

strcat字符串连接操作

strcpy字符串拷贝操作

strncat字符串连接操作(前n个字符)

strncpy字符串拷贝操作(前n个字符)

strchr查询字串

strstr 查询子串

 

time.h是C/C++中的日期和时间头文件。用于需要时间方面的函数。

引用方法

 

#include <time.h>

  ***时间操作函数得到处理器时间 clock***

  得到时间差 difftime

  设置时间 mktime

  得到时间 time

  时间转换函数 得到以ASCII码表示的时间 asctime

  得到字符串表示的时间 ctime

  得到指定格式的时间 strftime

 

这里我们还有一个符号没说太明白#表示预编译指令,当然预编译指令中不止include这一个

还有宏定义#defined还有#if #endif等

作者留言

关于c语言,现在单纯的c语言基本上不满足开发需求了,除了底层的数据处理之外几乎很少看见单纯的c语言了

对上层的包装现在一般都会用到Java对底层的架构开发也会去用c++(在考虑好之前不要直接去学c++,不然头都给你磕破,作者亲身经历过,不过经历过来也就好了),还有rust

在未来十年后,Java的身影可能不会像现在这样饱和了

我作为一个学网络安全的,来回头看c/c++对我个人而言是一件比较痛苦的事,虽然之前学c++也承受了不少痛苦,这里对c语言的介绍还不到百分之三十,但是拿来看一些代码是够了的(主要是个人的逻辑能力)

请登录后发表评论

    没有回复内容