Loading... # 二维数组名作为函数的参数 1. 如果函数内部想操作(<span style="color:#FF0000">读、写</span>)<span style="color:#FF0000">外部数组的元素</span>,请将外部数组的<span style="color:#FF0000">数组名</span>传递函数。 2. 数组名作为函数和形参会被优化 * int arr[5]----------------->int *p; * int arr[3][4]-------------->int (*p)[4]; * int arr[3][4][5]----------->int (*p)[4][5]; * int arr[3][4][5][6]-------->int (*)[4][5][6]; # 指针作为函数的返回值 * 不要返回普通局部变量的地址 ```C #include<stdio.h> int* get_addr(void) { int num = 1000;//不要返回普通局部变量地址 return &num } int main(int argc, char* argv[]) { int* p = NULL; p = get_addr(); printf("*p = %d\n", *p);//不确定 return 0; } ``` <div class="tip inlineBlock info"> 当函数运行结束后,函数里边的空间会被释放。 即程序忘记申请过这个空间,但是地址&num里边的内容还是1000。 因此*p是可以被正确打印的。 但是当你要申请其他空间test的时候,申请的空间可能和函数里边num申请并释放的空间是一块空间。而且对test空间的内容改动,*p的内容也会随之改动,p只是记住了这块空间的位置,并指向这块空间。因此指针p是不确定的。 (空间释放不代表内容清空) </div> * 那我们应该怎么传递地址? 1. 通过上面可以发现只要申请的空间num没有被释放,我们就可以传递局部变量地址。 2. 所以我们可以将num定义为全局变量 or 静态局部变量 3. 静态局部变量函数结束不会释放空间,只有进程结束才释放 ```C #include<stdio.h> int* get_addr(void) { static int num = 1000; return # } int main(int argc, char* argv[]) { int* p = NULL; p = get_addr(); printf("*p = %d\n", *p);//确定 return 0; } ``` 最后修改:2021 年 02 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏