指针参数&数组参数
一.数组传参
1.一维数组传参
下面列出了一维数组传参的几种形式,判断一下谁对谁错
#include <stdio.h>
void test(int arr[])//ok? 1
{}
void test(int arr[10])//ok? 2
{}
void test(int *arr)//ok? 3
{}
void test2(int *arr[20])//ok? 4
{}
void test2(int **arr)//ok? 5
{}
int main()
{
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
}
-
1,2,3是用test函数传入了arr数组.
1,2,3都是正确的,因为一维数组传参既可以用一维数组接收,也可以用指针接收(指针指向的是数组的首元素),此外用来接收函数传参的一维数组可以省略参数(验证了1的正确性) -
4,5是用test2函数传入了arr2数组
arr2是一个指针数组,其中存放了20个类型为int*的指针变量,利用test2函数传参arr2数组,可以用数组指针接收(如4),也可以用二级指针接收(如5),因为arr2传入的是一级指针的地址,需要使用二级指针接收.(验证了4,5的正确性)
2.二维数组传参
下面依然列出了一维数组传参的几种形式,判断一下谁对谁错
void test(int arr[3][5])//ok? 1
{}
void test(int arr[][])//ok? 2
{}
void test(int arr[][5])//ok? 3
{}
//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。
//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
//这样才方便运算。
void test(int *arr)//ok? 4
{}
void test(int* arr[5])//ok? 5 指针数组
{}
void test(int (*arr)[5])//ok? 6 数组指针
{}
void test(int **arr)//ok? 7
{}
int main()
{
int arr[3][5] = {0};
test(arr);
}
上述代码是利用test函数传入二维数组arr
-
首先1-3函数都是想利用二维数组接收参数.
但是由于二维数组传参函数形参的设计只能省略第一个[]的数字,因此2错误,1,3正确 -
然后4-7函数都是想利用指针的形式接收参数
二位数组传参传入的是数组首元素的地址,也即第一行元素的地址,需要用数组指针来接收,且指向第一行的五个元素,因此4,5错误6正确.7是用二级指针接收,也不符合要求,故7错误.
二.指针传参
1.一级指针传参
#include <stdio.h>
void print(int *p, int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d\n", *(p+i));
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);
//一级指针p,传给函数
print(p, sz);
return 0;
}
一级指针传参,形参就用一级指针接收
那如果当函数的参数是一级指针的时候可以接受什么参数?
void test(char* p)
{}
int main()
{
char ch='2';
char* ptr=&ch;
char arr[]="abcdef";
test(&ch);
test(ptr);
test(arr);
}
2.二级指针传参
#include <stdio.h>
void test(int** ptr)
{
printf("num = %d\n", **ptr);
}
int main()
{
int n = 10;
int*p = &n;
int **pp = &p;
test(pp);
test(&p);
return 0;
}
二级指针传参,形参就用二级指针接收
那如果当函数的参数是二级指针的时候可以接受什么参数?
void test(char** p)
{
}
int main()
{
char n='a';
char* p=&n;//一级字符指针
char** pp=&p;//二级字符指针
char* arr[5];//指针数组
test(&p);
test(pp);
test(arr);
}
总之,函数传入的参数类型要与形参类型相对应