一、数组传参
1.一维数组作为参数(形参)
一维数组作为参数(形参)传参时——>可用一维数组来接收(实参)
void test(int[10])
{
;
}
int main()
{
int arr [10]= {0};
test(arr);
return 0;
}
一维数组作为参数(形参)传参时——>可用一级指针来接收(实参)
void test(int*p)
{
;
}
int main()
{
int arr [10]= {0};
test(arr);
return 0;
}
C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。
2.二维数组
void test(int arr[][10])
{
;
}
int main()
{
int arr [10][10]= {0};
test(arr);
return 0;
}
接受时arr[][]第一个[]中可以忽略,但是第二个[]不能省略,因为二维数组可以不知道有多少行,但是一定得知道一行有多少个元素。
void test(int (*p)[10])
{
;
}
int main()
{
int arr [10][10]= {0};
test(arr);
return 0;
}
因为C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元 素首地址的指针,所以arr[10][10]可以写作 int (*p)[10]。
但这里需要注意的是:C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析 成一个指向其首元素首地址的指针。这条规则并不是递归的,也就是说只有一维数组才是 如此,当数组超过一维时,将第一维改写为指向数组首元素首地址的指针之后,后面的维 再也不可改写。比如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。
二、指针传参
1.一级指针传参(形参)
一级指针传参(形参)——>可以用一级指针接收(实参)
void test(int *p)
{
;
}
int main()
{
int *arr;
test(arr);
return 0;
}
指针p只是arr指针的临时拷贝(在栈上创建),所以test函数结束后就销毁了,如果要利用指针p则test函数必须要由返回值且类型为指针p的类型。然后在test函数最后加上return p;即可在利用函数返回值返回p的地址。
一级指针传参(形参)——>可以用二数组接收(实参)
void test(int arr[])
{
;
}
int main()
{
int *arr;
test(arr);
return 0;
}
同上C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。
一级指针传参(形参)——>可以用二维指针接收(实参)传的时一级指针的地址
void test(int**p)
{
*p= 2;
return p;
}
int main()
{
int *arr;
test(&arr);
return 0;
}
2.二级指针可以传参,用三级指针接收。(以此类推)但大部分情况下用来做实参接收一维数组,指针数组。
三、指针数组,数组指针传参
1.指针数组传参
指针数组传参(形参)——>可以用指针数组接收(实参),也可以用二级指针接收
void test(int *arr[])
{
;
}
int main()
{
int *arr[] = { 0 };
test(arr);
return 0;
}
指针数组传参(形参)——>可以用二级指针接收(实参)
void test(int **p)
{
;
}
int main()
{
int *arr[] = { 0 };
test(arr);
return 0;
}
同样C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析成一个指向其首元 素首地址的指针。
int*arr[]是指针数组做参数时编译器就解析为int*(*)arr。
2.数组指针传参
数组指针可做维二维数组传参时的实参。
总结:C 语言中,当一维数组作为函数参数(形参,实参)的时候,编译器总是把它解析 成一个指向其首元素首地址的指针。这条规则并不是递归的,也就是说只有一维数组才是 如此,当数组超过一维时,将第一维改写为指向数组首元素首地址的指针之后,后面的维 再也不可改写。比如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。