一级指针、二级指针做函数参数的深入剖析【转载】

转载:https://blog.csdn.net/huang1600301017/article/details/91040723

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

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

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

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

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

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

一、传变量

#include
using namespace std;
#include
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
using namespace std;
#include
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的地址,没有改变。

以上内容纯粹个人理解,如有不对之处,欢迎批评指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值