1、基本概念
指针数组 vs 数组指针
指针数组:首先是一个数组,数组中的每个元素都是指针
数组指针:首先是一个指针,这个指针指向一个数组
语法区别:
int *arr[10] //这是10个int指针组成的一维数组,存储的数据类型是int*
int (*arr)[10] //这是指向包含10个int的数组的指针
2、int (*arr)[10]的含义
int (*vis)[101]表示vis是一个指针,这个指针指向一个包含10个int元素的数组
所以vis可以指向二维数组的一行
举个例子:
#include <iostream>
using namespace std;
int main() {
int arr2d[3][5] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
// 正确:指针指向包含5个int的数组
int (*ptr)[5] = arr2d;
// 错误:指针指向包含3个int的数组,但实际每行有5个元素
// int (*ptr2)[3] = arr2d; // 编译错误
cout << "第二行第三列: " << ptr[1][2] << endl; // 输出8
ptr++; //此时ptr指向了第二行
cout<<ptr<<endl; //输出6的地址
cout<<*ptr<<endl; //ptr是指向数组arr2d[1]的指针,*ptr是arr2d[1]数组
cout<<**ptr<<endl; //*ptr是arr2d[1]数组,也就是arr2d[1]的首地址,**ptr就是6
cout<<"-----------------------\n";
cout<<ptr+1<<endl; //输出11的地址
cout<<*(ptr+1)<<endl; //输出11的地址
cout<<**(ptr+1)<<endl; //输出11
cout<<(*(ptr+1))[1]<<endl; //*(ptr+1)相当与arr2d[2],那么 (*(ptr+1))[1]相当与arr2d[2][1]也就是12
return 0;
}
3、一道C++数组指针的面试题
写出下面代码的输出结果
#include <iostream>
using namespace std;
int main(){
int n[][3]={10,20,30,40,50,60};
int (*p)[3];
p=n;
cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
return 0;
}
答案是:10, 20, 30
p是指向包含3个int的数组的指针,p指向二维数组n的第一行。
p[0][0]: p[0] 是第一行数组 {10,20,30}
p[0][0] 是第一行第一个元素 10
*(p[0]+1): p[0] 是第一行数组(类型是int*)
p[0]+1 指向第一行第二个元素(20的地址)
*(p[0]+1) 解引用得到 20
(*p)[2]: *p 是第一行数组 {10,20,30}
(*p)[2] 是第一行第三个元素 30
407

被折叠的 条评论
为什么被折叠?



