C++中的数组指针与数组引用

C++中的数组指针与数组引用

1.数组指针

数组指针是一个指向数组的指针,它和指针数组不一样

数组指针是形如

char (*ptr)[3];

它表示一个指向元素数目为3的数组的指针

而指针数组是形如

char *ptr[3]={"a","b","c"};

它其实是一个数组,数组元素是三个指针

数组指针和一般指针的不同是指针的偏移量不同

拿一个二维数组来说

int arr[2][3];

可以把这个二维数组看成一个一维数组,这个一维数组的每个元素又是一个数组,那么可以用一个数组指针来指向这个一维数组的某个元素

int arr[2][3];
int (*ptr)[3]=arr;

arr[2][3]可以看成是arr[2]这么一个数组,这个数组的元素又是一个大小为三的数组,此时用这个数组指针ptr指向arr[2]中的某个元素

int (*ptr)[3]=arr;

或者是

int (*ptr)[3]=&arr[1];

注意他们的下一层维度相同,不同会报错

#include<iostream>
#include<string>
using namespace std;
int main(){
    int arr[2][3];
    int (*ptr)[2]=arr;
    return 0;
}
//[Error] cannot convert 'int (*)[3]' to 'int (*)[2]' in initialization 

ptr指针的偏移量和一般指针是不一样的
(p为一般指针)

//32位 
#include<iostream>
#include<string>
using namespace std;
int main(){
    int arr[2][3];
    int (*ptr)[3]=arr;
    int *p=&arr[0][0];
    cout<<"p偏移前 "<<p<<"  p偏移后  "<<p+1<<endl;
    cout<<"ptr偏移前 "<<ptr<<"  ptr偏移后  "<<ptr+1<<endl;
    cout<<"&arr[0]偏移前 "<<&arr[0]<<"  &arr[0]偏移后  "<<&arr[0]+1<<endl;
    return 0;
}

这里写图片描述
ptr和&arr[0]都是数组指针,加一后偏移3 * sizeof(int)字节

把ptr解引用后变成* (ptr),* (ptr)虽然和ptr值一样但是代表的意义不同
(ptr)+1后是偏移3 * sizeof(int)字节
*(ptr+1)后是偏移sizeof(int)字节

例如

#include<iostream>
#include<string>
using namespace std;
int main(){
    int arr[2][3];
    int (*ptr)[3]=arr;  
    cout<<"ptr偏移前 "<<ptr<<"  ptr偏移后  "<<ptr+1<<endl;
    cout<<"*ptr偏移前 "<<ptr<<"  *ptr偏移后  "<<*ptr+1<<endl;
    return 0;
}

这里写图片描述

这一点类似于二维数组中的&arr,arr,arr[0]和&arr[0]
他们是数组指针,他们的值都相同,但是他们的偏移量不同

#include<iostream>
#include<string>
using namespace std;
int main(){
    int arr[2][3];  
    cout<<"&arr偏移前 "<<&arr<<"  ptr偏移后  "<<&arr+1<<endl;
    cout<<"arr偏移前 "<<arr<<"  ptr偏移后  "<<arr+1<<endl;
    cout<<"&arr[0]偏移前 "<<&arr[0]<<"  *ptr偏移后  "<<&arr[0]+1<<endl;
    cout<<"arr[0]偏移前 "<<arr[0]<<"  arr[0]偏移后  "<<arr[0]+1<<endl;
    return 0;
}

这里写图片描述
其中&arr是一个指向arr[2][3]的数组指针


2.数组引用

对数组的引用

int arr[2][3]={1,2,3,4,5,6};
int (&ptr)[3]=arr[0];
//这样声明了一个引用数组
//下一维度必须相同,否则报错
int &ptr[3]=arr[0];//错误,没有引用数组

这样就可以通过

    cout<<ptr[0]<<endl;
    cout<<ptr[1]<<endl;
    cout<<ptr[2]<<endl;

来访问数组arr[2][3]中的某一部分
访问的是arr[2][3]数组而不是它的拷贝


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值