1.枚举类型
枚举类型是用来表示一些离散值的
枚举常量默认从0开始,依次递增1
typedef enum{s1,s2,s3,s4
}num;
以上:s1=0,s2 = 1, s3 = 2, s4 = 3
可以为枚举常量显式指定值
typedef enum{s1 = 1,s2 = 2,s3 = 3,s4 = 4
}num;
枚举常量的调用有两种方法
- 直接使用枚举量
- 创建枚举类型变量来使用枚举量
typedef enum {s1 = 1,s2 = 2,s3 = 3,s4 = 4
}num;
int main() {//通过枚举变量调用num n1 = s1;printf("%d\n", n1);//直接使用枚举常量printf("%d\n", s2);return 0;
}
2.动态内存分配
动态内存分配的空间都是堆上的,分配出来的空间都需要手动销毁,所以最好分配大一点的空间,不然会降低效率。
动态内存分配是全局的,所以在函数中创建了动态分配的内存就不用加static也可以返回。
一般是字符串,数组,结构体才需要动态内存分配
可以使用三个函数进行动态内存分配,这三个函数都存放在<stdlib.h>
在动态内存分配完过后一定要判断是否成功,不然会出问题
int main() {int n = 10;int* a = (int*)malloc(sizeof(int) * n);//开辟十个内存空间大小的int型数组if (a == NULL) {printf("error");exit(1);}return 0;
}
题目:创建一个自动扩容的数组
vector.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#define SIZE 8
#define DEFAULT_GROW_CAPACITY 1024
//创建一个自动扩容的数组
typedef struct {int* elements;//指向推空间的数组int size;//元素个数int capacity;//数组容量
}vector;//创建结构体变量
vector* create();
//销毁
void destory_vector(vector* v);
//填充数组元素
void push_back(vector* v, int val);
//展示元素
void show_vector(vector* v);
voctor.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"vector.h"vector* create() {vector* v = (vector*)malloc(sizeof(vector));if (v == NULL) {printf("create faild in vector.c");exit(1);}v->elements = (int*)malloc(sizeof(int) * SIZE);if (v->elements == NULL) {printf("create v->elements faild in vector.c");free(v);//v已经创建成功exit(1);}v->size = 0;v->capacity = SIZE;return v;
}//销毁
void destory_vector(vector* v) {free(v->elements);free(v);
}//扩容
void grow_capacity(vector* v) {//如果capacity低于默认阙值,就扩容两倍,高于就扩容1.5倍if (v->capacity <= DEFAULT_GROW_CAPACITY) {v->capacity += v->capacity;}else {v->capacity += v->capacity / 2;}//创建扩容临时存储空间int* result = realloc(v->elements, sizeof(int) * v->capacity);if (result == NULL) {printf("grow_capacity faild in vector.c");free(v->elements);free(v);exit(1);}//将该空间给要被扩容的空间v->elements = result;
}//填充数组元素
void push_back(vector* v, int val) {if (v->size == v->capacity) {//扩容grow_capacity(v);}v->elements[v->size++] = val;//别忘了++
}//展示元素
void show_vector(vector* v) {for (int i = 0; i < v->size; i++) {printf("%d ", v->elements[i]);}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"vector.h"int main() {vector* v = create();if (v == NULL) {printf("create faild");exit(1);}for (int i = 0; i < 100; i++) {push_back(v, i);}show_vector(v);destory_vector(v);return 0;
}