一、C语言中的数组指针与指针数组
首先我们需要了解什么是数组指针以及什么是指针数组,如下图:
int *p[5]; //指针数组
int (*p)[5]; //数组指针
那么两个之间有什么区别呢:
数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向一个大小为5的数组。所以,int (*p)[5]即为一个数组指针。int *p[5]则是一个大小为5且存放整型指针的数组。
那么也可以理解为数组指针是指向数组的指针,其中数组中存放的还是指针,那么这就可以可以和二级指针的概念进行转换,以下通过实例来对两者进行对比。以下着重讲述指针数组,
二、数组指针作为形参传递
typedef struct {
int a;
int b;
}test;
void func1(test* tmp[]){
printf("func1:%d\n", ((test*)tmp + 0)->a);
printf("func1 ((test*)tmp)[0].c:%d\n", ((test*)tmp)[0].b);
printf("func1:%d\n", ((test*)tmp + 1)->a);
printf("func1 ((test*)tmp)[1].c:%d\n", ((test*)tmp)[1].b);
}
void func2(test* tmp){
printf("func2 ((test*)tmp + 0)->a:%d\n", ((test*)tmp + 0)->a);
printf("func2 tmp[0].b:%d\n", tmp[0].b);
printf("func2 ((test*)tmp + 1)->a:%d\n", ((test*)tmp + 1)->a);
printf("func2 tmp[1].b:%d\n", tmp[1].b);
}
int main(int argc, char const *argv[])
{
test aa[2];
aa[0].a = 1;
aa[0].b = 2;
aa[1].a = 3;
aa[1].b = 4;
func1((test**)aa);
printf("------------------------\n");
func2((test*)aa);
return 0;
}
结果:
func1:1
func1 ((test*)tmp)[0].c:2
func1:3
func1 ((test*)tmp)[1].c:4
------------------------
func2 ((test*)tmp + 0)->a:1
func2 tmp[0].b:2
func2 ((test*)tmp + 1)->a:3
func2 tmp[1].b:4
其实除了上述两种传参的方式之外还可以使用值传递的方式;
void func_3(test aa[])
这种方式不再进行详解。
|