结构体
结构体是一种自定义数据类型,它可以由多个不同类型的数据成员组成,用于表示一组相关的数据。结构体的定义通常包括以下部分:
1. struct关键字:用于声明这是一个结构体类型。
2. 结构体名称:自定义的结构体名称,通常采用驼峰式命名法。
3. 结构体成员:一组与结构体相关联的变量。
4. 分号:用于结束结构体定义。
结构体的定义通常形如:
```
struct myStruct {
int member1;
double member2;
char member3;
};
```
在此定义的结构体中,包含了三个数据成员:一个整型数据成员 `member1`,一个双精度浮点型数据成员 `member2`,以及一个字符型数据成员 `member3`。这样,我们就可以通过定义此结构体类型的变量来表示一组包含这三种类型的数据。
结构体指针
结构体指针是指一个指向结构体变量的指针。结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量。通过使用结构体指针,可以方便地访问和修改结构体中的各个成员变量。在C语言中,可以使用 "->" 运算符来访问结构体指针中的成员变量,例如:
```
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student stu = {"Tom", 18, 90.5};
struct Student *p = &stu;
printf("Name: %s\n", p->name);
printf("Age: %d\n", p->age);
printf("Score: %.2f\n", p->score);
return 0;
}
```
输出结果:
```
Name: Tom
Age: 18
Score: 90.50
```
结构体嵌套
结构体嵌套是指在一个结构体中嵌套另一个或多个结构体,将多个结构体组合在一起形成更复杂的结构体类型。嵌套结构体可以让程序员更方便地组织数据,使得代码更加模块化,可读性更强。
以下是一个简单的例子,演示如何在一个结构体中嵌套另一个结构体:
#include <stdio.h>
// 定义地址结构体
struct Address {
char street[50];
char city[30];
char state[20];
int zip;
};
// 定义人员结构体
struct Person {
char name[50];
int age;
struct Address address; // 嵌套地址结构体
};
int main() {
// 创建一个人员对象
struct Person person1 = {"Tom", 30, {"123 Main St", "New York", "NY", 10001}};
// 输出人员对象的信息
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Address: %s, %s, %s %d\n", person1.address.street, person1.address.city, person1.address.state, person1.address.zip);
return 0;
}
在上面的例子中,结构体`Person`中嵌套了结构体`Address`,我们可以通过`.`操作符来访问嵌套的结构体成员。
嵌套结构体的定义和访问都非常简单,但需要注意的是,结构体嵌套过多会使代码变得复杂,不易维护,建议尽量避免结构体嵌套过深。
字节对齐
Struct people
{
Char name[29];
Int age;
Double height;
};---》48
在计算结构体大小的时候,先看结构体内部成员的数据类型有没有超过4个字节,如果没有,就按照最大的数据类型进行对齐,如果超过4字节,就按照4字节对齐。
共用体
共用体(Union)是一种特殊的数据类型,它可以用来存储不同类型的数据,但是同时只能存储其中的一种数据,所以也称为联合体。共用体的定义方式与结构体类似,不同之处在于所有成员共享同一个内存空间,且共用体的大小等于其中最大成员的大小。
共用体的语法格式如下:
union [union_name] {
data_type member1;
data_type member2;
...
};
其中,union_name
是可选的共用体名称,data_type
是成员的数据类型,member1
、member2
等是共用体的成员。
共用体的使用方法与结构体类似,可以通过.
运算符访问成员。但是需要注意的是,只能同时访问其中的一个成员。当一个成员被赋值后,原先存储在共用体中的数据将被覆盖。因此,在使用共用体时需要注意不要出现多个成员同时被赋值的情况,否则会导致数据的混乱。
枚举
枚举内部的元素相当于给数字起别名。
枚举变量可以是字符,可以是数字,但是具体的结果要看格式控制符,并且枚举的大小永远是4字节。不能将浮点型作为枚举的变量。字符(字符串)都是数字的别名。
makefile嵌套
Makefile 嵌套(Nested Makefile)是指在一个 Makefile 文件中通过调用其他 Makefile 文件来构建多个目标或子目录的文件。这种做法可以使 Makefile 更加模块化,易于维护和扩展。下面是一个简单的示例:
# Makefile
# 定义变量
CC = gcc
CFLAGS = -Wall -g
# 调用子目录的 Makefile 文件
.PHONY: subdir
subdir:
cd directory && $(MAKE)
# 构建主程序
main: main.c
$(CC) $(CFLAGS) -o $@ $^
# 构建所有目标
all: subdir main
# 清理文件
clean:
$(RM) main
cd directory && $(MAKE) clean
在上面的 Makefile 文件中,我们使用 .PHONY
声明了一个伪目标 subdir
,并在该目标下调用了子目录中的 Makefile 文件。同时,我们定义了另外两个目标 main
和 all
,其中 all
目标包含了 subdir
和 main
两个目标,即在构建 all
目标时,会同时构建子目录和主程序。此外,我们还定义了一个 clean
目标,用于清理生成的文件。
在子目录的 Makefile 文件中,我们可以按照相同的方式定义目标和变量,并在主 Makefile 中通过 subdir
目标调用。这样,我们就可以通过逐级嵌套 Makefile 文件来构建复杂的软件工程了。
网络基础
IP
IP:定义
主机的唯一标识
点分十进制--》192.168.1.1
IP的分类和组成
A:一个网络地址+三个主机地址
网络地址最高位为0 0000 0000 ~0111 1111--》0~127
0.0.0.0~127.255.255.255
0.0.0.0:源地址 没有明确的Ip,都会被0.0.0.0接受
127开头的地址 本地环回地址
255结尾的地址 组播和广播地址
B: 两个网络地址+两个主机地址
第一个网络地址的最高位是10 10000000~10111111---》128~191
C:三个网络地址+一个主机地址 11000000~11011111--》192~223
D:第一个地址是1110
E:第一个是11110
子网掩码
子网掩码是一种用于将一个 IP 地址分成网络地址和主机地址的掩码。它是一个32位长的二进制数,由一定数量的 1 和 0 组成。在 IPv4 地址中,通常使用的子网掩码有三种形式:255.0.0.0,255.255.0.0,255.255.255.0。其中,255 表示该位置是网络地址,0 表示该位置是主机地址。通过子网掩码和 IP 地址进行逻辑与运算,可确定该地址的网络部分和主机部分。在 TCP/IP 网络中,使用子网掩码将一个网络划分成多个子网,以便更好地管理和控制网络流量和资源分配。
网关
网关(gateway)是一种网络设备,用于连接两个不同类型的网络,使得它们可以互相通信。网关通常作为网络的出口或入口,它可以将来自不同网络的数据转换成相应的协议格式,从而实现不同网络之间的连接和通信。例如,在一个公司内部,局域网(LAN)可以通过网关连接到广域网(WAN),从而实现与外界的通信。另外,网关还可以提供安全性、路由选择等功能,是网络中不可或缺的重要设备之一。
DNS服务器
域名解析服务器域名相当于是网址在计算机中存在域名服务表,这个中将IP地址和域名进行对应,输入baidu.baidu.cn Baidu.com都会跳转到www.baidu.com,然后将这个域名进行解析。一个IP可以对应多个域名,一个域名只有一个对应的IP。
SHELL命令
Shell命令是指在Unix/Linux操作系统中使用Shell解释器执行的命令。Shell命令可以用于文件管理、进程控制、网络通信、系统调试等方面。常见的Shell命令包括cd、ls、mkdir、rm、ps、kill、ping、ifconfig等。使用Shell命令可以提高工作效率和操作系统管理能力。
结构性语句
案例:
输入一个字符串,判断字符串是否存在,如果存在,判断是普通文件还是目录文件,如果是普通文件,先给这个普通文件的所有用户加上可执行的权限,并且输入一句话。如果是目录文件,在该目录下创建一个名为test.txt的文本文件,并输入一句话
文件名一定是一个字符串,判断文件是否存在,用-n
判断文件是否存在并且长度不为零 -s一个字符串可能是文件名,也可能是普通的字符串,首先要判断字符串是否存在,然后在字符串存在的基础上,判断这个字符串到底是文件名还是文件夹名
case
Case 变量 in
模式)
命令表 ;;
模式)
命令表 ;;
模式)
命令表 ;;
模式)
命令表 ;;
.........
Esac
For
for 格式 in 格式表
do
命令表
Done
While
while 命令
Do
命令表
Done
总结
C语言具有强大的能力和广泛的应用领域,其高级特性可以使得程序更加高效、灵活和易于维护,不仅可以开发应用程序,还可以设计操作系统和编写嵌入式软件。