使用场景
一般在业务比较复杂的情况下,才会考虑用二级指针;
二级指针的用法非常灵活,可以解决大多数数据模型;
void *
在引入二级指针之前,必须要强调下void *类型。
这种类型指针很好用,void * 可以指向任何数据类型。
因此,很多函数定义定义的时候,入参可定义成void *,调用时可传入任何类型的数据;
对于复杂的数据结构而言,也是一样,成员变量定义成void * 或void ** 更加便于数据处理;
数据结构设计及demo范式
typedef struct zc_arraylist_s{
void **array
int len;
int size;
zc_arraylist_del_fn del;
} zc_arraylist_t;
struct zc_rule_s {
int fd;
FILE *pipe_fp;
zc_arraylist_t *specs;
}zc_rule_t
- 用法
1. 声明 结构体类型指针;
2. 开辟内存,一级一级开辟
- demo范式
#define ARRAY_SIZE 10
zc_arraylist_t *array_new(void)
{
zc_arraylist_t *a_list;
a_list->len = 0;
a_list->size = ARRAY_SIZE ;
a_list = (zc_arraylist_t *) malloc(*a_list);
if (!a_list) {
printf("a_list malloc fail\n");
return NULL;
}
a_list->array = (void **) malloc (ARRAY_SIZE * sizeof (*(a_list->array)));
if (!a_list->array) {
printf("a_list array malloc fail\n");
return NULL;
}
return a_list ;
}
int rule_new(void)
{
zc_rule_t * rule;
/* 一级节点开辟,通用写法 */
rule = (zc_rule_t *) malloc (*rule);
if (!rule) {
printf("rule malloc fail \n");
return -1;
}
/* 二级节点开辟,通用写法 */
rule->specs= array_new();
if (!(rule->specs)) {
printf("array_new fail");
}
return 0;
- 不带void **,数据结构
以哈希表为例进行说明
typedef struct zc_hashtable_entry_s {
unsigned int hash_key;
void *key;
void *value;
struct zc_hashtable_entry_s *prev;
struct zc_hashtable_entry_s *next;
} zc_hashtable_entry_t;
struct zc_hashtable_s {
size_t nelem;
zc_hashtable_entry_t **tab;
size_t tab_size;
zc_hashtable_hash_fn hash;
zc_hashtable_equal_fn equal;
zc_hashtable_del_fn key_del;
zc_hashtable_del_fn value_del;
}zc_hashtable_t;
int hash_fun (void)
{
zc_hashtable_t* hash_table;
/* 一级开辟,通用写法 */
hash_table= (zc_hashtable_t*) malloc (*hash_table);
/* 二级开辟,通用写法 */
hash_table->tab= malloc (tab_size * sizeof (*(hash_table->tab)));
hash_table->tab_size = tab_size ;
hash_table->nelem = 0;
hash_table->hash = hash;
hash_table->equal = equal;
hash_table->key_del = key_del;
hash_table->value_del = value_del;
return hash_table;
}
网友评论