C语言进阶:指针的进阶(3)
数组传参和指针传参
实践之中不免会碰到数组和指针作函数参数而如何设计形参的问题。
一维数组传参
一维数组传参,下列接收方式是否可行呢?
//1.
void test(int arr[])
{}
//2.
void test(int arr[10])
{}
//3.
void test(int* arr)
{}
int main()
{
int arr[10] = { 0 };
test(arr);
return 0;
}
1.数组传参数组接收,可行但其实都会降级优化成指针,编译器不会真正创建一个数组。
2.由于形参数组形同虚设,所以数组大小无意义,任意大小或无。(有歧义)
3.数组传参本质就是首元素地址,首元素类型为int,所以指针的类型为int*。
所以可以看出[]和*()是等价的。我愿称之为*和[]的爱恨情仇!(‐^▽^‐)
//1.
void test2(int* arr[2])
{}
//2.
void test2(int** arr)
{}
int main()
{
int* arr2[10] = { 0 };
test2(arr2);
return 0;
}
指针数组,每个元素类型为int*
,故用二级指针接收数组名。
一维数组传参,数组和指针接收。
二维数组传参
//1.
void test(int arr[3][5])
{}
//2.
void test(int arr[][])
{}
//3.
void test(int arr[][5])
{}
int main() {
int arr[3][5] = { 0 };
test(arr);
}
- 二维数组传参用二维数组接收,行可省略,但列不可以。
//4.
void test(int* arr)
{}
//5.
void test(int* arr[5])
{}
//6.
void test(int(*arr)[5])
{}
//7.
void test(int** arr)
{}
int main() {
int arr[3][5] = { 0 };
test(arr);
}
4.整型指针接收的应该是整型变量的地址,而二维数组数组名为首行的数组地址。
5.指针数组和二维数组无关。
6.二维数组传参用首行数组大小的数组指针接收。
7.二级指针和二维数组无关。
- 二维数组数组名
arr
为首行“一维数组”的地址,数组的地址用数组指针接收。
int(*)[5]
型数组指针指向元素个数为5的一维数组。指针+1访问到下一行,每次跳一行。再解一层引用访问一行里每个元素。
一级指针传参
反向思考,若函数形参为指针,传参时实参可以如何设计呢?
void test(int* ptr, int sz)
{}
void test(int arr[],int sz)
{}
int main()
{
//1.
int a = 10;
test(&a);
//2.
int arr[10] = { 0 };
test(arr);
return 0;
}
- 一级指针传参,形参用指针和数组都行,但不提倡用一维数组。
- 若形参为指针,实参也可以是指针(地址),也可以是数组。
二级指针传参
当二级指针作参数时,形参如何设计呢?
void test(int** pp) {
printf("%d\n", **pp);
}
void test(int* arr[]) {//用法不好
printf("%d\n", *arr[0]);
}
int main() {
int a = 10;
int* p = &a;
int** pp = &p;
test(pp);
return 0;
}
- 当二级指针作函数参数时,形参可以是二级指针和指针数组。
当形参为二级指针,实参可以传什么呢?
void test(int** pp) {
printf("%d\n", **pp);
}
int main() {
int a = 10;
int* p = &a;
int** pp = &p;
int* arr[10] = { &a };
//1.
test(&p);
//2.
test(pp);
//3.
test(arr);
return 0;
}
- 当形参为二级指针时,实参可以是:二级指针(一级指针地址),指针数组首元素的地址。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341