问题描述
- 【关于C语言线性表参数的问题】
-
请问,*p,&p,* &p,这三个的区别是什么?为什么我在开辟空间时,参数设置成*p,后面的插入等操作就无法实现,而换成 * &p之后,就可以实现了
解决方案
你所指的就是常见的编程错误之一,返回指向栈内存的指针。
void fun( int *p )
{
p = (int *)malloc(sizeof(int));
}
int main(void)
{
int *ps;
fun(ps);
printf("heap setn");//可以执行到此
*p = 5;//Segmentation fault 发生段错误
free(ps);
return 0;
}
fun 函数的参数在栈中,当fun函数结束的时候,fun所持有的栈内存就会消失。p也会消失。在上例中,你实际上传人的是一个指针值,就和其他类型一样
,指针也有值,只不过指针的值是一个地址而已,所以你fun(ps)的时候,只是把ps的值(一个地址)copy到p,实际上,ps和p就不在同一个
地方,当fun返回后,p消失了,你也就不知道它所申请的内存在哪里了,所以程序可以执行到printf,再往下执行,*p发生段段错误,因为你想要给
未知的内存区域赋值。
Int *p,这是声明p是指针变量,
*p 这样是要引用p所指向的内存,例如上例中*p = 4;
&p 就是取得指针本身的地址,不是指针指向的地址。
解决方案二:
//指针
void swapint(int *a,int *b) { int t; t=*a; *a=*b; *b=t; }
//引用
void swapint(int &a,int &b) { int t; t=a; a=b; b=t; }
大致上,引用的效果等效于引用,差别就是存取时不需要加 * 前缀。
- &p 等效于 **p,把一个新开辟的空间指针传出去,当然要用双指针。单指针是用了操作指向的数据。
不过一般是谁创建谁销毁,不推荐下层开辟空间传到上层的做法,非常容易创建、销毁不成对而内存泄漏。所以双指针极少用。
时间: 2024-09-20 16:46:21