指针数组与数组指针的理解

1. 一维数组与指针

指针:指向某个地址的变量。也可以理解为一个保存着某个变量的地址的变量。它的定义方式为:int *p或者int* p,使用某个变量的地址对指针进行初始化,也可以先将其初始化为NULL,然后在要使用钱,使用某个亮的地址对其重新赋值,不能直接对使用NULL初始化的指针取对象并赋值,因为此时指针指向的地址为0地址,这一块地址一般是不允许进行赋值的。

​ 黑体部分为我的猜想,按照这样,应当有这样一个结果:假设我在这个指向0地址的指针上加上某个变量地址的偏移量,是否就能够指向这个变量。即有如下代码无错:

int *p;
int variable = 25;
//此行代码会报错:Invalid operands to binary expression ('int *' and 'int *'),可以考虑将 &variable 转换为10进制数,在进行操作,有时间再验证
cout<< *(p + &variable) << endl; //输出应该为25

指针数组:即指针的数组,也就是元素是指针变量的数组,本质上是一个数组变量。它的定义方式为:int* p[NUM]或者int *p[NUM],其中NUM为此数组的大小。可以这样理解这个定义式:因为" [] " 运算符的优先级高于” * “运算符的优先级,所以变量名p优先与[]结合,此时定义的是一个数组,剩下的部分按次序组成该变量的”类型“,即这个p变量的类型为:int*,这个可以读作整形指针,那么这个变量就可以这样理解:一个整形指针的数组变量。跟一般变量的理解一样,一个XX类型的XX变量。

数组指针:即数组的指针,也就是指向数组的指针,本质上是一个指针。它的定义方式为:int (*pp)[NUM]。与指针数组理解一样,因为加了括号的缘故,导致结合的优先级发生了改变,变量名优先与”*“运算符结合,剩下的部分按次序组成该变量的类型。即这是一个指针变量,类型是int[NUM],那么这个变量就可以这样读:一个NUM大的整形数组的指针变量。

​ 一维数组的名字本质上是一个常指针,基于此,结合下面代码进行对上述描述进一步理解:

int main(void){
    int a[4] = {1,2,3,4};
    int* b[4]; // 指针数组
    int (*c)[4]; // 数组指针
    int *p;

    for (int i = 0; i < 4; ++i) {
        cout << i << " ";
        b[i] = &a[i];
    }
    
    cout << endl;
    
    // 输出: 指针数组:2
    cout << "指针数组:" << *b[1] << endl;

    c = &a;
    // 输出: 数组指针:3
    cout << "数组指针:" << (*c)[2] << endl;

    p = a;
    // 输出: 指针:4
    cout << "指针:" << *(p+3) << endl;
    return 0;
}

注:上述关于数组指针与指针数组的理解为个人对两者的区别的理解,旨在能够正确使用两者,不论其在其他场景中的正确性。

2. 二维数组与指针

待更新…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值