你真的理解了数组指针和指针数组吗?

序言

数组指针和指针数组这两个概念接触的时候是在大学学习C/C++的时候,因为那个时候编程还没有在大学期间那么火热的情况下,因为都是大学生,从来不知道考虑毕业后的事情(要不怎么说是懵懂的大学生呢),那也是我接触的第二门编程语言(第一门是VB),说真的,老师上课讲的真是一脸懵逼啊,完全不理解,当时以为这是完全两个相同的概念,现在才发现,当时的我是有多么的不理解,哈哈…好了,言归正传,今天我重新拿起来C++,跟大家一起来再次揭开他们的真正面目。

概念

  • 数组指针:
    指针指向的元素是数组,我们称其为数组指针

  • 指针数组:
    数组的元素是指针类型,我们称其为指针数组

格式

数组指针

先给大家看一下基本的定义格式
1. 指向一维数组的指针类型变量:
指向类型(*指针变量名)[常量表达式]…

指向类型其实就是我们说的数据类型,看你的指针是哪个类型的,指针变量名顾名思义就是指针的名字,常量表达式,就是我们所说的数组维数,一维后面就写一个常量表达式,中括号里面是正整数。
2. 只想多维数组的指针类型变量
指向类型(*指针变量名)[常量表达式1][常量表达式2],…
举个栗子:

int (*p1)[5];//定义指向一维数组的指针变量p1
int (*p2)[2][3];//定义指向二维数组的指针变量p2

注意:这里的指针变量名必须括起来,因为[]的优先级高于*号,所以我们要让*号先执行,否则就变成定义数组了。

是不是看的有点懵圈,给大家看个图:

一维数组的含义

这个是一维数组的含义,很简单,p1的指向类型就是一个有着4个整形元素的一维数组。

这里写图片描述

这个是二维数组的含义,p2的指向类型就是一个有着12个整形元素的二维数组(3行4列)。

大家要注意的是,数组指针本意上是一个指针,而不是数组,我们记得他是一个指向数组的指针

指针数组

一样还是先给大家看一下指针数组的基本定义格式
1. 一维指针数组的定义:
指向类型 * 数组名[常量表达式]…

由于[]比 * 的优先级要高,因此先处理[],显然这样看起来就是数组形式。指针书每个元素均是一个“指向类型*”指针类型,即每个元素就是一个指针变量。
2. 多位指针数组的定义:
指向类型 * 数组名[常量表达式1][常量表达式2]…[常量表达式n],…
同样,先给大家举个栗子:

int *p1[5];//一维指针数组p1
int *p2[2][3];//二位指针数组p2

注意:指针数组“int * p[4]”与“int (*p)[4]”;写法差不多,但是意义上却完全不一样,后者是数组指针,大家记住了,别搞反了。

一样,给大家看个图:

指针数组的含义

这个是指针数组的含义,每个指针元素的值还是一个指针。

初始化
  • 数组指针
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//二维数组
int (*p)[4]=a;//指向数组的指针的初始化,a代表数组的第一行的第一个元素
  • 指针数组
int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//二维数组
int s[4]={a[0],a[1],a[2],a[3]};//一维指针数组初始化

示例

  • 数组指针
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},i,j,(*p)[4]=a;
    for(i=0;i<3;i++){
        for(j=0;j<4;j++){
            cout<<setw(2)<<p[i][j]<<endl;
        }
    }
    return 0;
}

运行结果:

1   2   3   4
5   6   7   8
9   10  11  12
  • 指针数组
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
    int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//二维数组
    int i,j,s[4]={a[0],a[1],a[2],a[3]};//一维指针数组初始化
    for(i=0;i<4;i++){
        for(j=0;j<4;j++){//s[i]为a[i]的行首地址
            cout<<setw(2)<<s[i][j]<<endl;//故s[i][j]等价于a[i][j]
        }
    }
    return 0;
}

运行结果:

1   2   3   4
5   6   7   8
9   10  11  12
13  14  15  16

总结

以上就是数组指针和指针数组的对比,两者从名字看仅仅只是名字颠倒着叫,但是其含义却大不相同,理解起来还是有点吃力,不过当你第一遍不理解的时候,再去看第二遍,第二遍不行就第三遍,我相信,铁杵磨成针,你一定会理解的,C/C++基础点其实不难,难点在于后期开发,因为偏于底层,如果大家有兴趣做这方面的工作,还是需要下一番苦心的,好了,说了这么多,如果大家还有什么不懂得欢迎留言讨论

每篇文章都来之不易,希望大家能够珍惜他人的劳动成果,如需转载请注明出处,如用作商业请联系我:905007127@qq.com非常安歇大家的支持
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值