Skip to content

2.9.1 指针数组与数组指针

2.9.1 指针数组与数组指针

我们学习指针,更重要的是为了能够更灵活地操作和管理数据

我们先讲一下这两个东西的区别

第二词表示真正的"本质"

也就是说,指针数组的本质是一个数组,其存储的数据为指针 数组指针的本质是一个指针,其指向的内容是一个数组

指针数组

指针数组,就是容纳多个指针的数组

常规形式实现

创建格式为

int* arr[] = {}

中括号里面写大小,大括号里面写初始值 也可以不写初始值,后续加入

实例

int arr[5] = {1,2,3,4,5};
int arr1[5] = {6,7,8,9,10};
int arr2[5] = {11,12,13,14,15};
int* p[3] = { arr,arr1,arr2 };
我们可以对p操作来管理3个数组 比如说
printf("%d\n", p[2][3]);
printf("%d\n", *((*(p + 2)) + 3));
这两个printf的输出结果是一样的

同时,我们也不难发现,指针数组与二维数组是类似的

动态内存形式实现

但是,既然我们已经学过动态内存了 我们不妨换一种方式来实现数组

我们通过动态内存申请下的内存,可以看作是一种数组,并且我们知道这个数组的地址

int** pp = (int**)malloc(3 * sizeof(int*));
for (int i = 0;i < 3;i++)
{
    pp[i] = (int*)malloc(5 * sizeof(int));
}

这样我们也做了一个指针数组 下面我们给出一个对它的操作案例

int num = 1;
for (int i = 0;i < 3;i++)
{
    for (int j = 0;j < 5;j++)
    {
        pp[i][j] = num;
        num++;
    }
}

for (int i = 0;i < 3;i++)
{
    for (int j = 0;j < 5;j++)
    {
        printf("%d\n", pp[i][j]);
    }
}

我们对这个指针数组内的每个指针指向的一维数组进行赋值,并进行输出

数组指针

和上面相反,数组指针就是指向数组的指针

也就是&arr

但是要注意的是,这里的&arr和&arr[0]还是有区别的,尽管他们的值一样

我们用p1来代指&arr(假设arr的长度为5个int),p2来代指&arr[0]

那么p1+1就是偏移20个字节 而p2+1就是偏移4个字节

也就是说,数组指针的偏移是以整个数组为单位的