总是不懂指针 看了一个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
其中一个回答:
你需要了解的是指针本身也是一个变量,其值是一个地址,注意这个地址是指针指向变量的地址,不是指针自己变量的地址,所以如果以指针作函数参数,那么形参和实参都是一个地址,都指向同一个变量(被实参指针指向的变量),可以通过这个地址改变被指向变量的值,但若你修改形参指针本身的值,实参指针并不会得到修改。
因为实参指针与形参指针是两个不同的变量,占据不同的内存位置,只不过传入参数时使这两个变量具有相同的值(被指向变量的地址)。
所以,如果你想修改一个变量,请传递此变量的地址(指针)。如果你想修改一个指针本身,请传递此指针的地址,也就是指针的指针,即二级指针。
所以说 “传递指针 只能改变指针的内容,却不能改变指针本身”
这句话的意思是:
指针本身是一个地址(所指的变量的地址)
形参指针和实参指针就是一起所指的变量的地址。
改变指针内容就是改变 变量 的值。
指针本身不变: 实参指针总是保存那个变量的地址 也就是说永远都指向它 形参改变指向重新分配内存,实参永远不改变