C++指針和數組:指針數組

1、基本含義

指針數組:數組中的元素全部爲指針,也就是數組中存放的是指針,基本形式如下:

 類型名     標識符  數組長度

看一下具體的例子就清楚了:

                                                                                 int * array_int[10]; //array_int 是數組名,數組中有十個元素,元素的類型爲 int*

float * array_float[10]; //array_float 是數組名,數組中有十個元素,元素的類型爲 float*

char * array_char[10]; //array_char 是數組名,數組中有十個元素,元素的類型爲 char*

這是指針數組中最常見的形式了,看到這裏有人可能會問,這樣的數組聲明和定義的方式和上一篇中的 int (*array_int) [10] 定義形式有什麼區別。不要着急,我慢慢給大家解釋清楚。

int (*array_int) [10] ;//  array_int是一個指針,指向一個存放十個int型元素的數組,這就是所謂的數組指針。這是因爲括號() 的優先級高,所以 *首先就和array_int結合所致。

本節中先講指針數組以及其最常見的用法,後面再講數組指針,以及其用法。


2、指針數組的定義形式

      1)、採用typedef 形式來定義   typedef  int*  int_pointer;

                                                              int_pointer    array_int[10];

      2)、採用直接定義的方式:   int * array_int[10] ;

       這兩種定義的方式均行得通,但是更常用的是第一種,通常把  typedef  int*  int_pointer;  放在頭文件中, 把  int_pointer    array_int[10]; 的實現放在 源文件中


3、指針數組的應用

      指針數組作爲一種數據結構,可以方便的存放數據,我們亦可以方便的訪問及修改指針數組中的數據,所以其應用比較廣泛。下面我舉得例子是指針數組在字符串處理方面的應用,大家可以舉一反三,一方面培養自己學習的能力,另一方面養成獨立的思考習慣,確實會利大於弊。

       

       從輸入流(也就是鍵盤中)中讀取數據存放入指針數組中,然後查詢一個字符或是字符串是否在該指針數組中:

      

#define NUM 6     //定義一個整數,表示數組中包含元素的個數
typedef char* pointer_array;  //使用typedef來定義指針數組類型
向指針數組中存入元素:

void Put_Data_In_Array(char **pChar)
{
    for(int i=0;i<NUM;i++)
    {
        *pChar = new char[12];
        cin>>*pChar;
        ++pChar;
    }
}
在存入元素之前,首先要分配內存空間,否則存入數據將失敗

指針數組作爲實參時,其形參類型有兩種,一種便是二級指針的形式,還有一種是 指針數組 即  char *pArray[6];

++pchar是讓pChar 指向pChar中存放的下一個元素,這其中涉及到指針的步長。指針的步長即爲指針所指向的元素的類型。


加上上一章中總結的,指針作爲函數參數基本齊全了,詳細請見鏈接: 點擊打開鏈接


查詢元素:

bool Is_Word_In_Array(char **pChar,char *word)
{
    for(int i=0;i<NUM;i++)
    {
        if(strcmp(word,*pChar)==0)
            return true;

        ++pChar;
    }
    return false;
}
如果找到元素就返回true,如果沒有找到就返回false


顯示指針數組中的元素:

void Display(char **pChar)
{
    /*while(NULL!= pChar)
    {
        cout<<*pChar<<endl;
        ++pChar;
    }*/

    for(int i=0;i<NUM;i++)
        cout<<*pChar++<<endl;

}


最後要釋放動態分配的內存空間避免內存泄露:

void Free_Array(char** pChar)
{
    char *pTemp;

    for(int i=0;i<NUM;i++)
    {
       pTemp = *pChar;
        delete [] pTemp;
        *pChar = NULL;

        ++pChar;
    }
}

最終程序運行的結果如下所示:


4、最後附上源代碼供相互學習和提高:


#include <iostream>
#include <string.h>
#define NUM 6
typedef char* pointer_array;
using namespace std;


void Put_Data_In_Array(char ** pChar); 
bool Is_Word_In_Array(char ** pChar,char *word);
void Display(char **pChar);
void Free_Array(char **pChar);

int main()
{
    pointer_array  array_char[NUM];

    char *Find_Word;
    Find_Word = new char[12];//分配內存空間,這樣才能存放數據

    cout<<"Please Initialize The Array:"<<endl;
    Put_Data_In_Array(array_char);

    cout<<"Please Input The Find_Word:"<<endl;
    cin>>Find_Word;

    if(Is_Word_In_Array(array_char,Find_Word))
        cout<<"The Word Is In Array!"<<endl;

    cout<<"Please Display The Array:"<<endl;
    Display(array_char);

    Free_Array(array_char);
    if(NULL!= Find_Word)
      {
        delete [] Find_Word;
         Find_Word = NULL; //釋放後將指針指向NULL,避免懸垂指針
      }
    return 0;
}


void Put_Data_In_Array(char **pChar)
{
    for(int i=0;i<NUM;i++)
    {
        *pChar = new char[12];
        cin>>*pChar;
        ++pChar;
    }

}

bool Is_Word_In_Array(char **pChar,char *word)
{
    for(int i=0;i<NUM;i++)
    {
        if(strcmp(word,*pChar)==0)
            return true;

        ++pChar;
    }

    return false;
}

void Display(char **pChar)
{
    /*while(NULL!= pChar)
    {
        cout<<*pChar<<endl;
        ++pChar;
    }*/

    for(int i=0;i<NUM;i++)
        cout<<*pChar++<<endl;

}


void Free_Array(char** pChar)
{
    char *pTemp;

    for(int i=0;i<NUM;i++)
    {
       pTemp = *pChar;
        delete [] pTemp;
        *pChar = NULL;

        ++pChar;
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章