----------------------------------------------------------
- 静态链表 -
----------------------------------------------------------
#include <stdio.h>
#include <string.h>
struct weapon{
int price;
char atk[20];
struct weapon * next;
}wea1,wea2,wea3,wea4,*head;
void main(){
// 赋值
wea1.price = 100;
strcpy(wea1.atk,"AWM");
wea2.price = 200;
strcpy(wea2.atk,"sass");
wea3.price = 300;
strcpy(wea3.atk,"98K");
wea4.price = 400;
strcpy(wea4.atk,"AK-47");
//设置指针
wea1.next = &wea2;
wea2.next = &wea3;
wea3.next = &wea4;
wea4.next = NULL;
//头指针指向wea1
head = &wea1;
//通过指针打印 weapon 变量
struct weapon * p;
p = head;
while(p!=NULL){
printf("%d , %s\n",p->price,p->atk);
p = p->next;
}
printf("output wea1 is :%s;output &wea1 is :%s\n",wea1,&wea1);
printf("%s\n",&wea1.atk);
}
----------------------------------------------------------
- 执行结果 -
----------------------------------------------------------
100 , AWM
200 , sass
300 , 98K
400 , AK-47
output wea1 is :d;output &wea1 is :d
AWM
.c文件 --> .i文件 --> .s文件 --> .o文件 --> 可执行文件
预处理 编译 汇编 链接
--在预处理阶段除了展开头文件,其次就是进行宏替换
#define R 3.14
...
float a = R
...
宏替换后:..a=3.14 ...(宏的本质就是单纯的发生在预处理阶段的字符串替换==> 即,宏不考虑语法,就是单纯的字符串替换!!!)
# 看一下在预处理中程序做了什么事情:语句代表将 helloworld.c 文件进行预处理,然后结果输出到 .i 文件中去
gcc -o helloworld.i helloworld.c -E
# -E 表示只让 gcc 进行预处理
# -o <文件> 输出到 <文件>。
#include <stdio.h>
//这个宏脱离了传参类型的限制,类似 Java 中的泛型;传入两个参数,对其进行加法运算。
#define ADD(a,b) (a+b)
//结构体变量定义、初始化和引用的过程
struct weapon{
char name[20];
int atk;
float price;
}weapon_1;
struct{
char name[20];
int age;
}people;
//共用体
//union 所有成员共享一块内存地址
union data{
int aa;
char bb;
float cc;
};
//相同结构的 结构体 和 公共体,打印他们的大小,看其占用内存空间的规则
struct data_str{
int aaa;
char bbb;
float ccc;
};
int main(){
// 定义结构体变量的同时赋值
struct weapon weapon_2={"ak-47",10,9.9};
//已经定义好的结构体变量赋值
weapon_1.name[0]='A';
weapon_1.name[1]='W';
weapon_1.name[2]='M';
weapon_1.atk=20;
weapon_1.price=19.9;
//结构体数组
struct weapon weapon_3[2] = {
{"java",30,18.8},
{"php",40,29.9}
};
//没有结构体名的结构体
people.age=18;
//结构体指针
struct weapon * w2;
w2 = &weapon_2;
//结构体数组指针
struct weapon * w1;
w1=weapon_3;
//共用体
union data data_union;
printf("weapon_1: %s,%d,%f\n",weapon_1.name,weapon_1.atk,weapon_1.price);
printf("weapon_2:%s,%d,%f\n",weapon_2.name,weapon_2.atk,weapon_2.price);
printf("wwapon_3: %s,%s\n",weapon_3[0].name,weapon_3[1].name);
printf("people.age is %d\n",people.age);
printf("w1[0] is : %s\n",w1->name);
w1++;
printf("w1[1] is : %s\n",w1->name);
//结构体指针,加括号是因为点的优先级高于星的优先级。一样的结果
printf("w2 is : %s,%s\n",(*w2).name,w2->name);
//共用体(联合 ---> 打印发现地址都是一样的(data_union.a:0xffffc4694d50)
//表示按十六进制输出数据,如果输出数据不够8位数,则左边补0
printf("data_union.a:%p,\ndata_union.b:%p,\ndata_union.c:%p\n",&data_union.aa,&data_union.bb,&data_union.cc);
//%u表示无符号10进制整型,
//%lu表示输出无符号长整型整数
printf("data_union size is :%lu\n",sizeof(data_union));
printf("data struct size is :%lu\n",sizeof(struct data_str));
return 0;
}
------------------------------执行结果------------------------------------
weapon_1: AWM,20,19.900000
weapon_2:ak-47,10,9.900000
wwapon_3: java,php
people.age is 18
w1[0] is : java
w1[1] is : php
w2 is : ak-47,ak-47
data_union.a:0xffffe228b730,
data_union.b:0xffffe228b730,
data_union.c:0xffffe228b730
data_union size is :4
data struct size is :12
c语言结构体
建立自己的数据类型
编译指令:预处理,宏定义
建立自己的数据类型:结构体,联合体,动态数据结构
逻辑运算符:&,|,~,^,<<,>>
递归函数的调用方法