對於二級指針的認識

對於二級指針的認識
      今天在寫鏈棧實現括號匹配的時候遇到了一個指針的問題。
     我在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->成員。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章