龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C语言之指针、数组和函数(3)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题: 图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵

  现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题:

  图示是一个指针数组。所谓动态性指横向(对应每行文本的字符个数)和纵向(对应整个文本的行数)两个方向都可以变化。

  就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组,实现了横向动态性。

  就竖向而言,可以动态生成及扩展需要的指针数组的大小。

  下面的代码演示了这种动态数组的用途:

// 用于从文件中读取以 '\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; // 横向“扩展”,指向不定长字符串

}

  问题:指针数组与数组指针与指向指针的指针

  指针和数组分别有如下的特征:

  指针:动态分配,初始空间小

  数组:索引方便,初始空间大

  下面使用高维数组来说明指针数组、数组指针、指向指针的指针各自的适合场合。

  多维静态数组:各维均确定,适用于整体空间需求不大的场合,此结构可方便索引,例a[10][40]。

  数组指针:低维确定,高维需要动态生成的场合,例a[x][40]。

  指针数组:高维确定,低维需要动态生成的场合,例a[10][y]。

  指向指针的指针:高、低维均需要动态生成的场合,例a[x][y]。

  问题:数组名相关问题

  假设有一个整数数组a,a和&a的区别是什么?

  答案与分析:

  a == &a == &a[0],数组名a不占用存储空间。需要引用数组(非字符串)首地址的地方,我一般使用&a[0],使用a容易和指针混淆,使用&a容易和非指针变量混淆。

  区别在于二者的类型。对数组a的直接引用将产生一个指向数组第一个元素的指针,而&a的结果则产生一个指向全部数组的指针。例如:

  int a[2] = {1, 2};

  int *p = 0;

  p = a; /* p指向a[0]所在的地方 */

  x = *p; /* x = a[0] = 1*/

  p = &a; /* 编译器会提示你错误,*/

  /*显示整数指针与整数数组指针不一样 */

  问题:函数指针与指针函数

  请问:如下定义是什么意思:

  int *pF1();

  int (*pF2)(); 

  答案与分析:

  首先清楚它们的定义:

  指针函数,返回一个指针的函数。

  函数指针,指向一个函数的指针。

  可知:

  pF1是一个指针函数,它返回一个指向int型数据的指针。

  pF2是一个函数指针,它指向一个参数为空的函数,这个函数返回一个整数。

精彩图集

赞助商链接