传递指针和传递指针的指针

总是不懂指针 看了一个csdn的问题 豁然开朗

在写一个栈的东西,在销毁的时候有点小问题
#define POSITION int
#define SIZE_T int
#define ELEMTYPE char
#define BUTTOM -1
struct stStack {
POSITION top;
ELEMTYPE *buffer;
SIZE_T MAXNUM;
SIZE_T length;
};
typedef struct stStack *PSeqStack;

如果这样写:
int destroy(PSeqStack *pstack)
{
if (*pstack==NULL) return 0;
if ((*pstack)->buffer==NULL)
{
free(*pstack);
return 1;
}
free((*pstack)->buffer);
free(*pstack);
*pstack=NULL;
return 1;
}

int main()
{
PSeqStack stack=createEmptyStack(5);
destroy(&stack);
printStack(stack);
system("pause");
return 0;
}

这样写是完全没问题的
但是——
int destroy(PSeqStack pstack)
{
if (pstack==NULL) return 0;
if ((pstack)->buffer==NULL)
{
free(pstack);
return 1;
}
free((pstack)->buffer);
free(pstack);
pstack=NULL;
return 1;
}

int main()
{
PSeqStack stack=createEmptyStack(5);
destroy(stack);
printStack(stack);
system("pause");
return 0;
}
这样在printStack(stack);的时候就会出错
通过调试,发现stack的值居然还不为NULL!但是如果用第一个的话就可以。
请大神来解释下好么?
更多 0

其中一个回答:


你需要了解的是指针本身也是一个变量,其值是一个地址,注意这个地址是指针指向变量的地址,不是指针自己变量的地址,所以如果以指针作函数参数,那么形参和实参都是一个地址,都指向同一个变量(被实参指针指向的变量),可以通过这个地址改变被指向变量的值,但若你修改形参指针本身的值,实参指针并不会得到修改。
因为实参指针与形参指针是两个不同的变量,占据不同的内存位置,只不过传入参数时使这两个变量具有相同的值(被指向变量的地址)。
所以,如果你想修改一个变量,请传递此变量的地址(指针)。如果你想修改一个指针本身,请传递此指针的地址,也就是指针的指针,即二级指针。


所以说 “传递指针 只能改变指针的内容,却不能改变指针本身”
这句话的意思是:
指针本身是一个地址(所指的变量的地址)
形参指针和实参指针就是一起所指的变量的地址。
改变指针内容就是改变 变量 的值。

指针本身不变: 实参指针总是保存那个变量的地址 也就是说永远都指向它 形参改变指向重新分配内存,实参永远不改变

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值