基础备忘:数组指针与对一维数组名取地址

一、指向一维数组的数组指针

数组指针是指向一个数组的指针。如

int (*p)[10];

p是一个指针,指向一个包含10个元素的一维数组,数组元素是整形。

如果写成了int *p[10],则是一个指针数组,由于[ ]的优先级比*的高,p先与[ ]结合,p就是数组类型的数据,元素是指针。

下面是数组指针与一维数组名取地址的实验:

#include<iostream>
using namespace std;
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,0};
    int (*p)[10];
    p=&a;
    cout<<a<<endl;
    cout<<&a<<endl;
    cout<<p<<endl;
    system("pause");
        }


地址值是一样的,但是意义却不一样。

1)a是数组名,也是数组的首地址,相当于&a[0],类型是int*,即指向int的指针。是一个一维指针,每增加1移动一个int单位。如int *p=a; p++;p指向的是元素a[1];实验代码如下:

#include<iostream>
using namespace std;
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,0};
    //int (*p)[10];
    int *p=a;
    p++;
    cout<<*(p)<<endl;
    cout<<a<<endl;
    cout<<&a<<endl;
    cout<<p<<endl;
    system("pause");
        }

结果:


2)&a的类型是int*[10],类型是指向一个含有10个int元素的数组的一个指针。是一个二级指针,每增加1移动1个Int[10]单位。如*(&a+1)表示整个数组后的一个单位,即0后面的一个单位。*(*(&a+1)-1)就表示a[9]=0;实验代码和结果如下:

#include<iostream>
using namespace std;
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,0};
    int (*p)[10];
    p=&a;
    cout<<*(*(&a+1)-1)<<endl;
    cout<<*(*(p+1)-2)<<endl;
    system("pause");
        }



结果:

3)p是数组指针,指向一个含有10个int元素的数组的一个指针a。与&a一致。


二、指向多维数组的数组指针。

指针与指向的数组的维数没有关系,关键在于数组指针是一个二级指针,指向一个一维数组单位。数组指针移动一个单位,相当于移动了一整个一维数组。

为了能更好地理解数组指针,与普通指针及二级指针的区别,下面举例说明一下。

例如:

int a[3][3];

int (*p)[3]=a;

这里a是个二维数组的数组名,相当于一个二级指针常量;p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以一维数组长度为单位;p+i是二维数组a的i行的起始地址,*(p+2)+2表示a数组2行2列元素地址(第一行为0行,第一列为0列),*(*(p+2)+2)表示a[2][2]的值。

实验代码如下:

#include<iostream>
using namespace std;
int main()
{
    int a[3][3]={1,2,3,4,5,6,7,8,9};
    int (*p)[3];//指针与指向的数组的维数没有关系,关键在于数组指针是一个二级指针,指向一个一维数组单位。数组指针移动一个单位,相当于移动了一整个一维数组。 
    p=a;//指向一维的是 p=&a;
    cout<<*(*(a+1)-1)<<endl;//对比一维 
    cout<<*(*(p+1)-2)<<endl;//对比一维 
    cout<<"*(*(a+2)+2): "<<*(*(a+2)+2)<<endl;
    cout<<"a[2][2]: "<<a[2][2]<<endl;
    cout<<"p[2][2]: "<<p[2][2]<<endl;
    cout<<"*(p[2]+2): "<<*(p[2]+2)<<endl;
    system("pause");
        }


结果:


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值