美文网首页
二级指针用法

二级指针用法

作者: github_lincy | 来源:发表于2019-01-11 17:27 被阅读0次

使用场景

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

void *

在引入二级指针之前,必须要强调下void *类型。
这种类型指针很好用,void * 可以指向任何数据类型。
因此,很多函数定义定义的时候,入参可定义成void *,调用时可传入任何类型的数据;
对于复杂的数据结构而言,也是一样,成员变量定义成void * 或void ** 更加便于数据处理;

数据结构设计及demo范式

  • 带void **,数据结构
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;
  • demo范式
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;
}

相关文章

  • 02-C语言的指针

    02-C语言的指针 目标 C语言指针释义 指针用法 指针与数组 指针与函数的参数 二级指针 函数指针 指针在C中很...

  • 二级指针用法

    使用场景 void * 数据结构设计及demo范式 带void **,数据结构 用法1. 声明 结构体类型指针;2...

  • 0x00 JNI预备知识

    1.JNI结构体指针及用法 在C中是二级指针,在C++中是一级指针。指向一堆定义好的函数(详情见oralcle官网...

  • 二级指针

    关于二级指针,可以参考这篇文章[二级指针的作用详解] 所谓二级指针可以理解为:指向指针的指针函数通常会将参数拷贝一...

  • C++ 指针与二维数组

    一级指针 二级指针

  • iOS中const的简单介绍

    简单用法 基本数据类型 const 在基本数据类型中的用法 指针类型 指针 的简单用法 const 与 指针 的结...

  • C语言指针部分说明

    二级指针 函数指针 数组和链表 访问数组 访问链表 Makefile

  • Const关键字理解(iOS)

    基本数据类型 const 在基本数据类型中的用法 指针类型 指针 的简单用法 const 与 指针 的结合使用 注...

  • C语言学习笔记——指针(二级指针和n级指针)

    今天学习了C语言中的二级指针和n级指针,总结如下: 另外,二级指针也可通过一级指针实现: 具体两种方法的差别请看我...

  • c基础 - 二级指针和多级指针

    前言 变量:就是给内存地址取一个别名; 1. 二级指针 二级指针:就是对一级指针再取地址; 2. 代码...

网友评论

      本文标题:二级指针用法

      本文链接:https://www.haomeiwen.com/subject/zfgxdqtx.html