1、指向数组的指针变量
int (*p)[4];表示p是一个指针变量,指向一个有4个整型元素的数组。*p有4个元素,每个元素为整型。
区别于
理解:首先该变量是一个含4个元素的数组,(*p)是数组名,相当于与下面对比 *p =
a,[4]的作用体现在
p =
p+1时,表示p移动的位置为4个整型的长度。
测试代码:
int (*p)[2];
int (*pp)[4];
int vec[4][2]= {{1,100},{2,200},{3,300},{4,400}};
pp = vec;
p = vec;
printf(" *((*pp+1)+0) is
%d\n",*(*(pp+0)+1));
printf(" *((*pp+0)+1) is
%d\n",*(*(pp+1)+0));
printf(" *((*p+1)+0) is
%d\n",*(*(p+0)+1));
printf(" *((*p+0)+1) is
%d\n",*(*(p+1)+0));
输出为:
因此:定义上,
int
(*p)[2];和 int *pp;本质上都是指针,均可以指向相同的数组以及变量,区别:1、只是当使用值的时候,
p=p+1移动的是2个整型的长度,pp=pp+1移动的是一个整型的长度。2、且在使用指针指向的值时,**p = *p;即
p是指针的指针。
int a[4]; 表示a 有4个元素,每个元素为整型。
2、
一个数组,若其元素均为指针类型数据,称为指针数组。也就是说,指针数组中的每一个元素都是相当于一个指针变量。例如:
int
* p[4];
理解:由于[]比*优先级高,因此p先与[4]结合,形成p[4]的形式,然后再与前面的*结合,显然表示是指针。指针数组的使用主要是比较适合用来指向若干个字符串,使得字符串处理更加灵活。
函数的参数如果是数组,或者是指针,调用时需要传递的参数就是地址,函数定义时,需要传递的参数部分只是参数变量的声明,调用时实际是对这些变量进行赋值,因此对于数组或者指针的赋值只能通过地址来实现。
加载中,请稍候......