2.9.1 指针数组与数组指针
2.9.1 指针数组与数组指针
我们学习指针,更重要的是为了能够更灵活地操作和管理数据
我们先讲一下这两个东西的区别
第二词表示真正的"本质"
也就是说,指针数组的本质是一个数组,其存储的数据为指针 数组指针的本质是一个指针,其指向的内容是一个数组
指针数组
指针数组,就是容纳多个指针的数组
常规形式实现
创建格式为
中括号里面写大小,大括号里面写初始值 也可以不写初始值,后续加入
实例
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 };
同时,我们也不难发现,指针数组与二维数组是类似的
动态内存形式实现
但是,既然我们已经学过动态内存了 我们不妨换一种方式来实现数组
我们通过动态内存申请下的内存,可以看作是一种数组,并且我们知道这个数组的地址
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个字节
也就是说,数组指针的偏移是以整个数组为单位的