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

来源:互联网 发布:思维导图 mac版下载 编辑:程序博客网 时间:2024/06/06 01:38

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 0