在讲述内容之前,先讲四点重要知识
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的地址,没有改变。
以上内容纯粹个人理解,如有不对之处,欢迎批评指正。
转载请留言,说明出处。