数组指针
int (*p)[n];
首先P是一个指针,指向一个整型一维数组,这个数组的长度是n,也就是P的步长,
如果P++,那么P就跳过n长度到下一个数组,
如果用指针定义一个二维数组
int a[3][4];
int (*p)[4]//定义一个数组指针,该指针指向一个有4个元素的一维数组
p = a//将二维数组中首个一维数组的地址给指针,就是a[0]或者&a[0][0]
p++//指针P指向的下一个一维数组就是a[1][ ];
所以数组指针是指向一维数组的指针,也就是行指针
输入二维数组的方法可以是:
for(i = 0 ; i < MAX_SIZE;i++)
//scanf("%s",*p + i)
//scanf("%s",&(*p)[i])
数组指针的使用条件是:函数传参的时候
一维数组名传参:用的是元素的指针
void print_ptr(char *ptr)/void print_ptr(char ptr[100])
二维数组名传参:用的是一维数组的指针
void print_prt(char (*ptr)[100])/void print_prt(char **ptr)
三位数组名传参:用的是二维数组的指针
void print_ptr(char (*ptr)[3][100])/void print_ptr(char ***ptr)
//对一维数组的数组名取地址= 数组的地址
//对一维数组的地址取值= 数组元素的首地址
指针数组
int *p[n]:该数组中有n个指针类型的元素。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
{
初始化:因为定义一个指针数组,数组中的指针都是野指针,所
以要进行内存空间的分配
p[i] = (int *)malloc(sizeof(int));
p[i]=a[i];
}
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。
例如:
用指针数组遍历字符串
char *ptr[3] = {"hello1","hello2","hello3"};
for(i = 0;i < 3;i++)
{
printf("ptr[%d] = %s\n",i,ptr[i]);
}
函数传参
void print_ptr(char **ptr)//因为数组里存放的是指针,所以形参必须用指针的针
来接参,传过来的实参是:指针变量或者是指针数组。
{
int i;
for(i = 0; i < 3;i++)
{
//printf("%s\n",ptr[i]);
// printf("%s\n",*(ptr + i));
}
}
_
数组指针只是一个指针变量,C语言里一般专门用来指向二维数组的,它占有内存中一
个指针的存储空间。
指针数组是多个指针变量,以数组形式存在内存当中,占有多个
指针的存储空间。