| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2297 人关注过本帖
标题:一个形参为指针传递的问题
只看楼主 加入收藏
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
结帖率:92.86%
收藏
已结贴  问题点数:20 回复次数:9 
一个形参为指针传递的问题
int StackPop(SequenceStack *S, LPBTreeNode *p)
{
    if (S->top <= 0)
    {
        printf("堆栈已空无数据元素出栈!\n");
        return 0;
    }
    else
    {
        S->top--;
        p = &(S->stack[S->top]);
        return 1;
    }
}
这是其中一个函数,运用栈堆来处理非递归遍历的,LPBTreeNode是二叉树类型,我想问一下,原本传进来的P是空值,然后我利用p = &(S->stack[S->top]); 我调式在这里面p也拿到了栈顶的地址,但是为什么回到调用函数里面p却还是空了,求大神指引
搜索更多相关主题的帖子: 形参 指针 传递 top  
2018-11-03 10:55
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
收藏
得分:0 
调用 StackPop的函数
void npreOrder(LBinaryTreeNode *root)//先序遍历
{
    SequenceStack s;
    LPBTreeNode *p = root;
    StackInitiate(&s);
    while (StackNotEmpty(s) || p)
    {
        if (p)
        {
            visit(p);
            StackPush(&s, *p);
            p = leftchild(p);
        }
        else
        {
            StackPop(&s, p);
            p = rightchild(p);
        }
    }
}
2018-11-03 10:56
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
收藏
得分:0 
下面是我另外一种写法,是成功的,我在困惑为什么我第一种p会是空值
LPBTreeNode* StackPop(SequenceStack *S, LPBTreeNode *p)
{
    if (S->top <= 0)
    {
        printf("堆栈已空无数据元素出栈!\n");
        return NULL;
    }
    else
    {
        S->top--;
        p = &(S->stack[S->top]);
        return p;
    }
}
void npreOrder(LBinaryTreeNode *root)//先序遍历
{
    SequenceStack s;
    LPBTreeNode *p = root;
    StackInitiate(&s);
    while (StackNotEmpty(s) || p)
    {
        if (p)
        {
            visit(p);
            StackPush(&s, *p);
            p = leftchild(p);
        }
        else
        {
            p=StackPop(&s, p);
            p = rightchild(p);
        }
    }
}
将StackPop的函数返回类型修改,p就得到栈顶的地址了,但是这跟我第一种好像没什么不同啊,&是可以取地址的啊
2018-11-03 11:05
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:396
专家分:2640
注 册:2018-3-30
收藏
得分:20 
int StackPop(SequenceStack *S, LPBTreeNode *p)
LPBTreeNode 用二重指针才可以把地址带出去。

saber,别哭.
2018-11-03 12:23
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
收藏
得分:0 
我把上面的问题简化了,
#include<stdio.h>
#include<stdlib.h>
void text(int *s,int *p)
{
    p = s;
}
int main()
{
    int *p,*s;
    int i = 1; int j = 2;
    p = &i; s = &j;
    text(s,p);
    printf("%d",*p);
    system("pause");
        return 0;
}
这个编译是输出1的,但是我对于这个的理解是,我调用text函数,就是要把s的地址赋给p,然后输出2的,但是却还是输出1,为什么呢?
2018-11-03 12:26
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:396
专家分:2640
注 册:2018-3-30
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
void text(int *s,int **p)
{
    *p = s;
}
int main()
{
    int *p,*s;
    int i = 1; int j = 2;
    p = &i; s = &j;
    text(s,&p);
    printf("%d",*p);
    system("pause");
    return 0;
}

saber,别哭.
2018-11-03 12:30
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:396
专家分:2640
注 册:2018-3-30
收藏
得分:0 
其实很简单,你要是想通过形参把一个值带出去,你会传一个指向值的地址。
那么,你想带一个地址出去,就得传一个指向地址的地址。

saber,别哭.
2018-11-03 12:34
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
收藏
得分:0 
回复 6楼 幻紫灵心
那我知道怎么改了 谢谢,我还要去百度一下二重指针,加深理解和它的应用
2018-11-03 12:47
一鑫
Rank: 2
等 级:论坛游民
帖 子:111
专家分:12
注 册:2018-4-12
收藏
得分:0 
回复 7楼 幻紫灵心
问一下,这两个数值互换,我用二级指针操作,应该怎么操作
void swap3(int *p1,int *p2) //起初我以为可以的
{   int *t;
    t=p1; p1=p2; p2=t;
}
void main()
{  int a,b;  
   int  *p_1, *p_2;
   scanf("%d,%d",&a,&b);
   p_1=&a; p_2=&b;  
   if (a<b)  swap3(p_1,p_2);
   printf("max=%d,min=%d\n",a,b);
}
2018-11-03 13:09
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
以下是引用一鑫在2018-11-3 13:09:34的发言:

问一下,这两个数值互换,我用二级指针操作,应该怎么操作
void swap3(int *p1,int *p2) //起初我以为可以的
{   int *t;
    t=p1; p1=p2; p2=t;
}
void main()
{  int a,b;  
   int  *p_1, *p_2;
   scanf("%d,%d",&a,&b);
   p_1=&a; p_2=&b;  
   if (a<b)  swap3(p_1,p_2);
   printf("max=%d,min=%d\n",a,b);
}

交换a,b就无需用二级指针操作
交换p_1,p_2可以:
#include <stdio.h>

void swap3(int **p1,int **p2)
{
    int *t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}

void main()
{
    int a,b;
    int  *p_1, *p_2;
    scanf("%d,%d",&a,&b);
    p_1=&a;
    p_2=&b;
    printf("%d, %d\n", *p_1, *p_2);
    swap3(&p_1, &p_2);
    printf("%d, %d\n", *p_1, *p_2);
}

2018-11-03 14:54
快速回复:一个形参为指针传递的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032460 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved