指针进阶-数组参数、指针参数
数组参数,指针参数
在设计函数的时候,参数可以写成数组,也可以写成指针。
一维数组传参
void test(int arr[])
{}
void test(int arr[10])
{}
void test(int *arr)
{}
void test2(int *arr2[20])
{}
void teat2(int **arr2)
{}
int main()
{
int arr[10]={0};
int *arr2[20]={0};
test(arr);
test2(arr2);
return 0;
}
上面代码,第一个void没有问题,数组传参,用数组接收。 第二个void也没有问题,“10”没有太大的意义,可写可不写。 第三个void,数组传参,传的是首元素的地址,用指针接收,且指针类型正确,没有问题。 第四个void,arr2是一个存放指针的数组,用指针数组接收,没问题。 第五个void,数组名是首元素的地址,类型是int* ,用一个二级指针来接收,没有问题。
二维数组传参
void test(int arr[3][5])
{}
void test(int arr[][5])
{}
void test(int arr[][])
{}
void test(int *arr)
{}
void test(int *arr[5])
{}
void test(int (*arr)[5])
{}
void test(int **arr)
{}
int main()
{
int arr[3][5];
test(arr);
return 0;
}
上面代码,前两个void都没有问题,实参是数组,形参也是数组,行可以省略,但是必须知道一行有多少个元素,所以列不可以省略,所以第三个void错误。 第四个void不行,数组名表示首元素地址,是第一行的地址。应该写成第六个void的形式。 第五个void不行,实参是首元素的地址,形参却是一个指针数组。 第六个void不行,实参是地址,但不是指针的地址,与二级指针不匹配。
一级指针传参
//用一级指针接收
void print(int* ptr, int sz)
{
for(int i=0; i<sz; i++)
{
printf("%d ", *(ptr+i));
}
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int* p=arr;
int sz=sizeof(arr)/sizeof(arr[0]);
print(p, sz);
return 0;
}
一个函数的参数是一级指针,那它能接收什么参数呢?
1、可以接收与参数指针类型相同的地址。
test(&ch);
2、可以接收存放了相同类型地址的一级指针。
test(p);
二级指针传参
void test(int** pa2)
{
**pa2==20
}
int main()
{
int a=10;
int* p=&a;
int** pa=&p;
test(pa);
printf("%d", a);
return 0;
}
一个函数的参数是二级指针,那它能接收什么参数呢?
1、传一级指针的地址。
test(&p);
2、存放一级指针数组的数组名。