C++基础---指针数组与数组指针
来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/05/21 09:37
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++数组、指针数组、数组指针
- 【C基础】数组指针 or 指针数组???
- C++基础---指针数组与数组指针
- C 基础 (数组与指针)
- c语言基础—指针与数组
- c/c++ 基础(三) 指针与数组
- C语言基础-指针与数组
- C语言基础 指针与数组
- C语言基础之指针与数组
- C数组与指针
- c 指针与数组
- C 数组与指针
- C数组与指针
- 指针与数组 C
- C指针与数组
- c数组与指针
- C-数组与指针
- C指针与数组
- c指针与数组
- Android_开源框架_Afinal
- 友元函数
- C++基础---数组
- C++基础---多维数组
- Keepalived简介
- C++基础---指针数组与数组指针
- 多线程
- 我自己的noip复习(实时更新)
- 【Python】virtualenv —— 建立Python虚拟环境
- 算法题:剔除字符串(很有意思)
- python爬虫 爬取淘女郎介绍以及照片
- APACHE2.X 禁止服务器IP直接访问
- 生活灵感汇总
- Azure WEBsite 的跨站点高可用(上海数据中心-北京数据中心)