指针数组

有如下定义:
struct UT_TEST_STRUCT *pTo[2][MAX_NUM];
  请分析这个定义的意义,并尝试说明这样的定义可能有哪些好处?
  答案与分析:
  前面我们谈了数组指针,现在又提到了指针数组,两者形式很相似,那么,如何区分两者的定义呢?分析如下:
  数组指针是:指向数组的指针,比如 int (*pA)[5]。
  指针数组是:指针构成的数组,比如int *pA[5]。
  至于上述指针数组的好处,大致有如下两个很普遍的原因:
  a)、各个指针内容可以按需要动态生成,避免了空间浪费。
  b)、各个指针呈数组形式排列,索引起来非常方便。
  在实际编程中,选择使用指针数组大多都是想要获得如上两个好处。
问题:指向指针的指针
  在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?
  答案与分析:
  首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。
  现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题:
  图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的行数)两个方向都可以变化。
  就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。
  就竖向而言,可以动态生成及扩展需要的指针数组的大小。
  下面的代码演示了这种动态数组的用途:
// 用于从文件中读取以 '\0'结尾的字符串的函数
extern char *getline(FILE *pFile);
FILE *pFile;
char **ppText = NULL; // 二维动态数组指针
char *pCurrText = NULL; // 指向当前输入字符串的指针
ULONG ulCurrLines = 0;
ULONG ulAllocedLines = 0;

while (p = getline(pFile))
{
 if (ulCurrLines >= ulAllocedLines)
 {
  // * 当前竖向空间已经不够了,通过realloc对其进行扩展。
 ulAllocedLines += 50; // 每次扩展50行。
  ppText = realloc (ppText, ulAllocedLines * (char *));
  if (NULL == ppText)
  {
   return; // 内存分配失败,返回
  }
 }
 ppText[ulCurrLines++] = p; // 横向“扩展”,指向不定长字符串
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值