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;
    }
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值