首先写一些基本的东西,譬如关于c语言语法的,还有一些注意事项。
struct student {
int age;
char *number;
int score;
};
//这段代码会创建一个自定义的数据类型,叫做struct student
//或者使用typedef来简化
typedef struct student{
int age;
char *number;
int score;
}student;
//这样为struct student 起了一个别名叫做student.
//以上都是创建这样一个属于你自己的数据结构
student li_ming={18,"12345",97};
//这个是创建具体的数据,student叫做数据类型,li_ming为变量名
当时用结构指针时,表述如下
void string_compare(student *li_ming)//说明需要传递一个结构指针
{
//函数体
}
string_compare(&xiao_ming)//xiao_ming是一个结构变量,&为取地址符号
(*li_ming).age=18;
li_ming->age=18;
//上面两种表述都可以,这里li_ming是一个结构指针
为了对比,下面简单说一下联合union.
typedef union{
int age;
char* number;
}student;
//创建一个union数据结构
student li_ming={.age=18};
//union的数据结构在创建时只会保存一个值,这样可以节省空间。
再谈谈枚举。
enum color={RED,GREEN};
或者
typedef enum{
RED,GREEN
}color;
//枚举就是说你只能在RED,GREEN中选择。
下面简单说一下链表,他就是一种抽象数据结构,每一个结构中保存了下一个同样结构的地址。如果用结构struct来写的话如下
typedef struct student{
int age;
char *number;
struct student *next;//这里创建了一个结构指针
}student
下面写个简单的例子加强印象,,,其实是为了灌水
#include<stdio.h>
int main()
{
typedef struct train_line{
char* initial_station;
char* finally_station;
int longth;
struct train_line *next;
}train_line;
train_line jingguang={"changsha","zhengzhou",800,NULL};
train_line longhai={"zhengzhou","baoji",1000,NULL};
train_line baocheng={"baoji","chengdu",300,NULL};
jingguang.next=&longhai;
longhai.next=&baocheng;
int buff;
fscanf(stdin,"%i",&buff);
switch(buff){
case 1:
{
fprintf(stdout,"\
%s\n",jingguang.initial_station);
break;
}
case 2:
{
fprintf(stdout,"%s\n",longhai.initial_station);
break;
}
case 3:
{
fprintf(stdout,"%s\n",baocheng.initial_station);
break;
}
}
//注意点switch语句的使用方法,case中只能是单个字符,不能是字符串
今天写的东西都是一些基础的,百度上一大堆的东西,,可我还是写下来了。。。。
下面再写一下动态分配内存的问题:
先回顾一下知识点;
(1)栈:用来保存局部变量的区域,一旦函数返回,该变量被收回
(2)堆:用于长期保存数据的地方,不会自动清除。
(3)malloc()函数,让操作系统给你分配空间,返回值为该地址void *类型指针。要写stdlib.h的头文件。
(4)free()函数,释放空间
下面自己动手写一个有关于动态分配的例子,不是很全,希望大家批评改正。
首先我的意思很简单,创建这样一个结构,结构中保存着自己的名字,以及父亲和母亲的结构指针,这样就可以通过自己找到父亲母亲的相关信息
首先写一个头文件叫做declare.h
#ifndef DECLARE_H
#define DECLARE_H
typedef struct family{
char* self_name;
struct family* mum;
struct family* dad;
}family;
//上面是这个结构的声明,实际上编译时并没有分配内存
family* create(char* self_name);
//这个是函数的声明,注意要放到上面结构声明的下面,否则会出先未定义的错误
#endif
创建一个函数,保存在create.c的文件中
#include"declare.h"
#include<string.h>//strdup()字符串复制函数位于这个头文件中
#include<stdlib.h>//由于malloc()函数位于这个头文件之中
family* create(char* self_name)
{
family* buff=malloc(sizeof(family));
buff->self_name=strdup(self_name);
buff->mum=NULL;
buff->dad=NULL;
return buff;
}
接下来写主函数
#include<stdio.h>
#include"declare.h"
int main()
{
family* wujunyi=create("wujunyi");
family* wuguannan=create("wuguannan");
family* liuhongju=create("liuhongju");
wuguannan->mum=liuhongju;
wuguannan->dad=wujunyi;
fprintf(stdout,"%s\n",wuguannan->mum->self_name);
}
最后自己使用gcc编译
gcc main.c create.c -o main
其实最开始的时候,我不知道把申明的struct结构变量放到哪里去,所以一直编译不通过,后来无意间看了赵岩的《C语言点滴》中关于声明和定义的那几章才发现错误,这里也是感谢。其实程序本身很简单,主要是体会这样一个过程。最后再写一个makefile吧
c_learning.o: c_learning.c create.c declare.h
gcc -c c_learning.c
create.o: create.c declare.h
gcc -c create.c
c_learning: c_learning.o create.o
gcc c_learning.o create.o -o c_learning