二级指针用法

2019-01-11  本文已影响0人  github_lincy

使用场景

一般在业务比较复杂的情况下,才会考虑用二级指针;
二级指针的用法非常灵活,可以解决大多数数据模型;

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
#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;
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;
}
上一篇 下一篇

猜你喜欢

热点阅读