1. 指针数组与数组指针
1.1 指针数组的定义
- 指针数组:是数组元素为指针的数组,本质为数组;
- 指针数组:每一个元素均为指针,即有诸形如“*ptr_array[i]”的指针。
注:由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。 - 指针数组的定义形式为:类型名 *数组标识符[常量表达式];
如:int *a[4];//指针数组
表示:数组a中的元素都为int型指针
元素表示:* a[i]跟* (a[i])是一样的,因为[]优先级高于*
1.2 指针数组的应用
- 指针数组:可以作为函数的参量使用,使用方式与普通数组类似。
指针数组:常适用于指向若干字符串,这样使字符串处理更加灵活方便。
#include<iostream> using namespace std; int main() { char *p[5] = {"h", "e", "l", "l", "o"}; for(int i=0; i<5; i++) { cout<<p[i]<<"\t"; } cout<<endl; for(int i=4; i>=0; i--) { int x = i+65; p[i] = (char*)(&x); cout<<p[i]<<"\t"; } cout<<endl; system("pause"); return 0; } =>h e l l o E D C B A
1.3 指针数组与二维数组
- 二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。
指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。以下定义: 他们在内存的存储方式分别如下图所示,可见,系统给数组c分配了4×8的空间,而给p分配的空间则取决于具体字符串的长度。此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
char c[4][8]={"my","name","is","Mini"};//二维数组的定义 char *p[4]={"my","name","is","Mini"}; //指针数组的定义
注:由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
1.4 数组指针的定义
- 数组指针:指向数组首元素的地址的指针,本质为指针,(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);
- 数组指针:存放的是数组首地址的地址,相当于2级指针,这个指针不可移动;
- 数组指针的定义形式为:类型名 (*数组标识符)[常量表达式];
如:int (*a)[4];//数组指针
表示:指向数组a的指针
元素表示:(*a)[i];
1.5 数组指针的应用
代码示例:
#include<iostream> using namespace std; int main() { char c[][3] = {"h", "e", "l", "l", "o", "o"}; char (*p)[3] = c; for(int i=0;i<=5;i++) { cout<<*(p+i)<<"\t"; } cout<<endl; for(int i=5; i>=0; i--) { //(*p)[i] = "X";//编译报错,error C2440: “=”: 无法从“const char [2]”转换为“char” cout<<*(p+i)<<"\t"; } cout<<endl; system("pause"); return 0; } =>h e l l o o o o l l e h
1.6 指针数组与数组指针的程序对比
代码示例:
#include <iostream> using namespace std; int main() { int c[4]={1,2,3,4}; int *a[4];//指针数组 int (*b)[4];//数组指针 b=&c; //将数组c中元素赋给数组a for(int i=0;i<4;i++) { a[i]=&c[i]; } cout<<*a[1]<<endl; //输出2就对 cout<<(*b)[2]<<endl; //输出3就对 system("pause"); return 0; } =>2 3
注:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。
总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。
参考文献:
[1]《C++全方位学习》范磊——第十四章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3]《C++Primer(中文版)》王刚、杨巨峰——第三章
[4] 百度搜索关键字:C++数组、指针数组、数组指针