数组指针与指针数组

      数组指针与指针数组这两者虽然听起来很像,但是他们的本质却截然不同

在这之前,我们先了解一下二维数组,二维数组的格式为 : 数组类型   数组名 [ ][ ];

前一个代表的是数组的行数,后一个代表的是数组的列数,其实二维数组的元素可以理解为是一维数组,

  int a[2][2] = {{1,2},{3,4}};
 
这个 二维数组 由 两个一维数组 构成, 分别是 {1,2},{3,4};

还有一个概念要了解一下,优先级的概念

这‘ ( ) ’,‘ [ ] ’, ' * ' 三个标识符在语句中的优先级是  ' ( ) ' > ' [ ] ' > ' * ' 

接下来正式介绍数组指针与指针数组——

      数组指针的本质是一个指向数组的指针;

      指针数组的本质是一个包含元素为一个个指针的数组;

1.数组指针

    数组有一维数组,二维数组,一般数组名可以被当作是指向数组首元素的地址。

而一维数组的数组指针形式以及应用如下

int a[5] = { 1,2,3,4,5 };
int* p = a;  //一维数组指针

cout << p << endl;
cout << a << endl;
cout << &a[0] << endl;  三者的结果其实都是数组 a 的首元素的地址


cout<< p[1] << endl;
cout<< a[1] << endl;    这两者的结果是一样的 —— 指针 p 可以代替数组名 a 的位置;

而二维数组,我们之前讲过,二维数组的元素是一个个一维数组,而结合一维数组的指针,那么二维数组的指针应该是可以指向每一个一维数组的首元素地址,那么二维数组的指针形式如下

int a[2][2] = { {1,2},{3,4} };

int(*p)[2] = a;  //二维数组指针


cout << p << endl;
cout << &a[0][0] << endl;   指针 p 指向的就是二维数组的首元素( a[0][0] )的地址。


cout<<p[1]<<endl;
cout<<&a[1]<<endl;   
cout<<&a[1][0]<<endl;       这三者都是a[1][0]的地址,也是第一行的首元素的地址。
cout<<p[2]<<endl                              得出来的是第二行的首元素的地址。




cout<<p[1][1]<<endl;
cout<<a[1][1]<<endl;   两者的结果也是一样的,  p 可以代替数组名a;
    

2.指针数组

在这里我们讲一下指针数组的格式,

 类型标识符 解引用符 数组名[ ]

int* p[5];    指针数组

int (*p)[5];  数组指针

注意 根据上文的优先级可以得知 :

    在指针数组中变量名 p 是先和‘ [ ] ’ 结合构成数组,而‘ * ’则是和   ‘ int ’联系,表明数组的元素类型为整形指针,最终构成一个指针数组。

    在数组指针中变量名 p 在‘( )’的作用下,先是和 ‘ * ’ 结合构成指针,之后在与 ' [ ] ' 结合构成数组指针。

     指针数组的实际操作如下

int a = 10;
int b = 5;

int* p[2] = {&a,&b};   指针数组


cout << p[1] << endl;  输出的是 a 的地址
cout << *p[1] << endl; 输出的是 10
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值