指针数组

/*
 指针数组
 数组的类型可以是任意类型,比如整数数组,double数组,char数组,当然可以是指针数组
 数组里的每个元素都是装的一个地址,如果是整数指针数组表示数组里的各元素都是一个整数变量的地址
 本质上是数组,是存储地址的数组
 */

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    // 一、指针数组
    int a=3,b=4,c=5,d=6;
    int *p[4] = {&a,&b,&c,&d}; //里面的每个元素都是地址,元素类型为int*类型,长度为4
    for(int i=0;i<4;i++){
        cout<<*(p[i])<<endl; // p[i] 取出的是地址,*(p[i]) 是这个地址对应空间的值
//        cout<<*p[i]<<endl; //也可以不加括号,因为[]优先级比*更高,如果不确定时最好加上
    }
    cout<<endl;
    /*
     输出:
     3
     4
     5
     6
     */
    
    
    // 二、数组的拉链结构(指针数组的应用)
    /*
     用一维指针数组存储的每个元素为地址指向的是一个数组,可以不同长度的数组,相当于二维数,但二维数组的元素个数要一样,但拉链结构可以不同
     访问方式与二维数组类似
     */
    int a1[] = {2,3,4};
    int a2[] = {4,5,6,7};
    int a3[] = {1,2};
    
    int *p1[3] = {a1,a2,&a3[0]}; //把数组地址存入指针数组中  &a3[0]与a3等价
    cout<<p1[1][1]<<endl; // p1[1] 是下标1元素为a2,a2是一个地址 a2+[1],满足地址+偏移量,所以取了数组a2偏移为1的内容
    cout<<p1[1][2]<<endl;
    cout<<endl;
    /*
     输出:
     5
     6
     */
    
    
    
    return 0;
}