C++指针和数组:指针数组
2015-10-28 08:55
381 查看
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;
}
}
相关文章推荐
- C++正则表达式库
- 【C语言】求解最大公约数
- 黑马程序员****OC语言基础****protocol概念和理解
- 黑马程序员****OC语言基础****Block概念和理解
- What does “warning: not all control paths return a value” mean? (C++)
- 使用两个栈实现一个队列
- C++ 参数传递,定义与声明,命名空间等基本知识
- 黑马程序员****OC语言基础****MRC的理解
- C语言swap函数总结
- C++运算符重载详解
- 自学C++第一天
- C++Primer笔记二
- VC++动态链接库(DLL)编程
- C/C++ 之 char*,const char*和string 三者转换
- C语言程序入门第一节课/4
- c++单例模式
- Data语意学 - 类的大小应该是多少? (The Semantics of Data )
- 格雷码的C++实现
- C++plus 2.6
- C语言:值传递