二维数组名作为函数的参数

  1. 如果函数内部想操作(读、写外部数组的元素,请将外部数组的数组名传递函数。
  2. 数组名作为函数和形参会被优化
  • int arr[5]----------------->int *p;
  • int arr3-------------->int (*p)[4];
  • int arr3[5]----------->int (*p)4;
  • int arr35-------->int (*)4[6];

指针作为函数的返回值

  • 不要返回普通局部变量的地址
#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;
}

当函数运行结束后,函数里边的空间会被释放。

即程序忘记申请过这个空间,但是地址&num里边的内容还是1000。

因此*p是可以被正确打印的。

但是当你要申请其他空间test的时候,申请的空间可能和函数里边num申请并释放的空间是一块空间。而且对test空间的内容改动,*p的内容也会随之改动,p只是记住了这块空间的位置,并指向这块空间。因此指针p是不确定的。

(空间释放不代表内容清空)

  • 那我们应该怎么传递地址?
  1. 通过上面可以发现只要申请的空间num没有被释放,我们就可以传递局部变量地址。
  2. 所以我们可以将num定义为全局变量 or 静态局部变量
  3. 静态局部变量函数结束不会释放空间,只有进程结束才释放

    #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 日
如果觉得我的文章对你有用,请随意赞赏