一级指针、二级指针做函数参数的深入剖析

在讲述内容之前,先讲四点重要知识

1.当传入参数时,函数形参会立即申请形参的内存空间,函数执行完毕后,形参的内存空间立即释放掉

1.指针是存放其他变量地址的变量。指针有自己的内存空间,内存空间存放的是其他变量的地址。

2.指针具体指向谁,要看指针内存空间存放的地址。存放谁的地址就指向谁。

3.函数参数传参本质:实参传给形参,都是拷贝.

指针做函数参数的本质剖析,讲述四种情况

一、传变量

#include <iostream>
using namespace std;
#include <cstring>
void change(int value)
{
    value = 20;
}

void main()
{
    int a = 10;
    change(a);
    cout << a << endl;
    system("pause");
}

为什么没有修改呢?

change(a)传参时,value申请内存空间,这时有两个内存空间,a的内存空间内容10拷贝形参value,这时value内存空间的内容为10,value = 20,修改了value内存空间的内容,a内存空间的内容仍然是10,所以未修改。

二、一级指针——初级

#include <iostream>
using namespace std;
#include <cstring>
void change(int *p)
{
    *p = 20;
}

void main()
{
    int a = 10;
    change(&a);
    cout << a << endl;
    system("pause");
}

为什么修改了?

change(&a)传参时,指针变量p申请内存空间,这时有两个内存空间,a的地址拷贝给形参p,p的内存空间存放的是a的地址,即p指向a,*p = 20,即修改p指向的内存空间——a的值。所以修改了。

三、一级指针——高级

void GetMemory(char *p)
{
    p = (char *)malloc(sizeof(100));
}

void main()
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");//一级指针产生中断,因为没有分配内存
                               //二级指针正常
    cout << str << endl;
    free(str);
    system("pause");
}

产生中断,也就是说上面的程序存在问题,有什么问题呢?

GetMemory(str)传参时,指针变量p申请内存空间,这时有两个内存空间,str的内存空间的内容拷贝给p,即p的内存空间的内容是NULL,p指向空。 p = (char *)malloc(sizeof(100)),在堆上面申请一个100的内存空间,返回这个内存空间的首地址赋值给p,此时p的内存空间的内容为这个首地址,p指向这块内存空间,而与str没有任何关系,str仍然是NULL.因此在strcpy(str, "hello world")时,出现中断。

四、二级指针

void GetMemory(char* *p)
{
    *p = (char *)malloc(sizeof(100));
}

void main()
{
    char *str = NULL;
    GetMemory(&str);
    strcpy(str, "hello world");//一级指针产生中断,因为没有分配内存
                                          //二级指针正常
    cout << str << endl;
    free(str);
    system("pause");
}

这个为什么拷贝成功了呢?

在讲述之前,先注意p是二级指针,*p是一级指针,GetMemory(&str)传参时,指针变量p申请内存空间,这时有两个内存空间,str的地址拷贝给p的内存空间,即p的内存空间的内容是str的地址,这时p指向str的内存空间--->p = &str,*p = str,*p 和 str两个名字,其实是相等的,指向的是同一块内存空间(上述程序在此时是NULL)。* p = (char *)malloc(sizeof(100)),在堆上面申请一个100的内存空间,返回这个内存空间的首地址赋值给*p;*p是一级指针,*p(str)内存空间就有值了,不再是NULL,内存空间的内容是这个地址,也就是*p和str指向这块内存空间,这个内存空间可以存放100个变量的地址,所以指针是存放其他变量地址的变量还是对的。接下来的strcpy(str, "hello world")也就成功了,free(str)释放掉str(*p)所指向的内存空间.请注意,在这个过程中,p的内存空间的地址始终是str的地址,没有改变。

以上内容纯粹个人理解,如有不对之处,欢迎批评指正。
转载请留言,说明出处。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值