1.指针数组:
指针数组的主语是数组,顾名思义就是存放指针的数组
数组内每个元素都存放着地址,每个地址又指向一块区域
书写形式举例:
int* parr[5]={&a,&b,&c,&d,&e};
用指针数组打印元素内存放地址中的数值:
#include<stdio.h>
int main()
{
int a = 1, b = 2, c = 3, d = 4,e = 5;
int* parr[5] = { &a,&b,&c,&d,&e };
int i = 0;
for (i = 0;i < 5;i++)
{
printf("%d ", *(parr[i]));
}
return 0;
}
1.1指针数组模拟二维数组:
只能说模拟,因为二维数组中的元素是连续存放的,而指针数组中的元素不是连续存放的
#include<stdio.h>
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[]={2,3,4,5,6};
int arr3[]={3,4,5,6,7};
int* parr[3]={arr1,arr2,arr3};
int i=0,j=0;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
printf("%d ",parr[i][j]);
}
}
return 0;
}
细节理解:
数组指针中存放的是数组名,也就是每个数组首元素的地址,所以 arr[i] 指向的是一维数组 arr[i]=*(arr+i)
arr[i]认为是一维数组的数组名,arr[i][j]就指向一维数组中的某个元素
2.数组指针:
数组指针变量主语是指针,是用来存放数组的地址,能够指向数组的变量
int arr[]={1,2,3,4,5};
int (*p)[5]=&arr;
因为[ ]的优先级大于 * ,所以要加()保证 * 是先与 p 结合
数组指针初始化的时候,用 &数组名 获得数组地址
注意:int (*p)[5] 中 [5] 不能省略
2.1二维数组传参本质:
以前的二维数组传参,形参部分写的是二维数组的形式(行能省略,列不行)
二维数组每个元素都可以看成是个一维数组,即每一行都是一维数组
所以,二维数组传参的本质是将首元素(即第一个一维数组)的地址传了过去
形参部分写成指针形式时,只需第一个数组的元素个数即可
void test(int(*p)[5],int r,int c)
代码改变:
#include<stdio.h>
void test(int (*p)[5],int r,int c)
{
int i=0,j=0;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
printf("%d ",p[i][j]);//或者:*(*(p+i)+j)
}
printf("\n");
}
}
int main()
{
int arr[3][5]={ {1,2,3,4,5},{2,3,4,5,6 } ,{3,4,5,6,7} };
test(arr, 3, 5);
return 0;
}
⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式