C++:关于指针数组与数组指针的若干问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值