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]数组而不是它的拷贝