函数与指针

直接对函数进行值传递

值传递不能在函数内部改变外部变量的值

void setNum01(int data)
{
    data = 100;
}

void test02()
{

    int num = 0;
    setNum01(num);// 如果不用指针 会遇到的问题
    // 
    cout << num << endl;//0 如果是单向值传递,则修改不成功
}

为什么会出现这个现象,调用setNum01时会为形参 data开辟空间,实际上是 int data = num,所以修改的都是data,而不是num

直接对函数进行地址传递

如果想在函数内部 修改外部变量的值 需要将外部变量的地址 传递给函数

void setNum02(int *p)
{
    // 这里相当于*p = &num
    *p = 100;
}

void test03()
{

    int num = 0;
    setNum02(&num);
    // 
    cout << num << endl;//100 如果靠指针传递,则修改成功
}

成功的原因,调用setNum02时,其形参p指向了num的第一个字节,因此p相当于去了num的值,修改的是num

当函数的输入是数组时

一维数组作为函数参数,会被编译器优化成指针变量!!!!


void outprint(int n, int *p)// 这个地方如果不是 int *p, 而是arr[5],其结果跟int *p 一样,因为编译器会被优化成指针变量
// void outprint(int n, int arr[5]) //上面和下面是一个意思
{
    for(int i =0; i < n; i++)
        cout << *(p+i) << endl;

}

void test04()
{

    int arr[5] = {10,20,30,40,50};
    int n  = sizeof(arr)/sizeof(arr[0]);
    outprint(n, arr);


}

同理,函数内部 想操作 函数外部的二维数组 需要将二维数组名 传递给函数
二维数组作为函数的形参,会被优化成 一维的数组指针。

void outprint2d(int (*p)[4],int row, int col)
{
    for(int i = 0; i<row; i++)
    {
        for(int n=0; n<col;n++)
        {
            cout << *(*(p+i)+n) << endl;

        }
    }

}
void test05()
{

    int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    int row = sizeof(arr)/sizeof(arr[0]);
    int col = sizeof(arr[0])/sizeof(arr[0][0]);

    outprint2d(arr,row,col);


}

函数的返回值位指针为类型

用处:将函数内部的合法地址通过返回值 返回给函数外部使用
注意:函数不要返回局部变量的地址

原因如下:

int *getAdd(void) // 注意返回值是int *
{
    int data = 100;

    return &data;// 不要返回局部变量地址

}

void test06()
{
    int *p = NULL;
    p = getAdd();

    cout << "*p = " << *p<< endl;// 这种情况返回值是空的
}

原因是data在函数里开辟了空间,在函数返回后,这个空间被释放了,所以变成空的了,所以返回也是空

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值