有如下定義:
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; // 橫向“擴展”,指向不定長字符串
}