对于二级指针的认识
今天在写链栈实现括号匹配的时候遇到了一个指针的问题。
我在main函数里定义了一个结构体指针,然后使用func(Node *p)这样的函数申明让它去指向另一个指针,然后程序就报错了。
我调试了一下午,都不知道到底错在哪,以前写链表的时候一直都是这样做的。然后我就把问题放在了csdn上让万能的网友来帮忙,于是就颠覆了我对指针的认识。我才发现还有func(Node *p),func(Node *&p),func(Node **p)三种不同的用法。
如要将top指针在函数里指向s,不能用 SqStack *top这样的函数声明,这样的函数声明不会真正修改主函数,只有
所以以后不要用
而如果是
我在main函数里定义了一个结构体指针,然后使用func(Node *p)这样的函数申明让它去指向另一个指针,然后程序就报错了。
我调试了一下午,都不知道到底错在哪,以前写链表的时候一直都是这样做的。然后我就把问题放在了csdn上让万能的网友来帮忙,于是就颠覆了我对指针的认识。我才发现还有func(Node *p),func(Node *&p),func(Node **p)三种不同的用法。
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct SqStack
{
char c;
struct SqStack *next;
}SqStack;
void InitStack(SqStack *s,SqStack **top)
{
*top=s;
}
void InitStack(SqStack *s,SqStack **top)
{
top=s;
}
void Push(SqStack *s,SqStack *&top,char c)//入栈,先对原来的top赋值,然后再申请新空间,top指向新空间
{
SqStack *temp;
temp=(SqStack *)malloc(sizeof(SqStack));
top->c=c;
temp->next=top;
top=temp;
}
int main()
{
SqStack *base;
SqStack *top;
SqStack *s;
s=(SqStack *)malloc(sizeof(SqStack));
s->next=NULL;
InitStack(s,&top);
char ch;
scanf("%c",&ch);
Push(s,top,ch);
printf("%c",top->next->c);
}
如要将top指针在函数里指向s,不能用 SqStack *top这样的函数声明,这样的函数声明不会真正修改主函数,只有
SqStack **top
这样将指针的地址传入函数将其修改才行,指针指向的对象为一级指针如Swap函数,而需要在函数里才说明指向的对象,需要传二级指针。
所以以后不要用
SqStack *top
应该用
SqStack *&top
在主函数的形式都是一样的。
而如果是
SqStack **top
那么在主函数指针名前应该加&。在函数内应该用*p->成员。