| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 593 人关注过本帖, 1 人收藏
标题:【交流】关于参数传递及修改问题
只看楼主 加入收藏
n0noper
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:39
专家分:159
注 册:2015-3-21
收藏(1)
 问题点数:0 回复次数:6 
【交流】关于参数传递及修改问题
程序代码:
#include <stdio.h>
#include <malloc.h>

//////////////////////////////////////////////////////////////////////////
//结构体定义
//////////////////////////////////////////////////////////////////////////
typedef struct Node{
    int iNum;                //各种成员。。。
    struct Node *pNext;        //下一个节点
}stNode, *pNode;


//////////////////////////////////////////////////////////////////////////
//说明:很多人会像如下一样进行参数传递
//////////////////////////////////////////////////////////////////////////
void Create(pNode p_pNode)    //不要说自己是void Create(struct Node* p_pNode)
{
    p_pNode = (pNode)malloc(sizeof(stNode));    //为p_pNode申请内存空间
    p_pNode->pNext = NULL;                        //指针赋值,防止"出轨"

    p_pNode->iNum = 10;            //纯粹为了演示
}

int main(void)
{
    pNode l_pNode = NULL;

    Create(l_pNode);        //很多人以为的创建

    printf("iNum  = %d\n", l_pNode->iNum);
    printf("pNext = %d\n", l_pNode->pNext);

    return 0;
}
/************************************************************************
刚来论坛没几天,但是看到很多人都是这么写程序(尤其最近很多人在学数据结构,链表操作)
好好理解一下指针:
void fun(int i);    //值传递,i是拷贝了一份给fun,调用fun时传递的变量没有改变
void fun(int *i);    //这里看你传过来的是什么
//如果是&i,那么就是传递了i的地址,可以进行任意修改操作
//如果是int *i中的i,那么对不起,你传递的是int*类型的一份拷贝,修改同样无效
//我知道很多人不服气,自己验证一下。
//学过汇编的人,一定能懂我的心 :)

如果你懂了,就绕行;初学者们,深入理解一下(不会太深):
有图有真相!
//Re:不会弄···打包吧。非美工,将就着看。
*************************************************************************/
//现在应该知道怎么写了吧?


有什么不同意见,大家一起讨论交流。
参数传递.rar (4.87 KB)
搜索更多相关主题的帖子: color 
2015-03-24 10:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
提上來看看

授人以渔,不授人以鱼。
2015-03-25 18:01
孤独的守候
Rank: 2
等 级:论坛游民
威 望:1
帖 子:25
专家分:32
注 册:2015-3-25
收藏
得分:0 
楼主,别闹了~
你传了一个NULL指针给参数,然后在函数内部重新创建了一段内存,然后往新创建的内存里填东西,函数调用完毕后,
新创建的内存就被释放了,于是乎就有了你的结论。
为了不说空话,我改了下你的程序~talk is cheap , show me the code
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//////////////////////////////////////////////////////////////////////////
//结构体定义
//////////////////////////////////////////////////////////////////////////
typedef struct Node{
    int iNum;                //各种成员。。。
    struct Node *pNext;        //下一个节点
}stNode, *pNode;


//////////////////////////////////////////////////////////////////////////
//说明:很多人会像如下一样进行参数传递
//////////////////////////////////////////////////////////////////////////
void Create(pNode p_pNode)    //不要说自己是void Create(struct Node* p_pNode)
{
    p_pNode->pNext = NULL;                        //指针赋值,防止"出轨"

    p_pNode->iNum = 10;            //纯粹为了演示
}

int main(void)
{
    pNode lp_Node = (pNode)malloc(sizeof(stNode));

    Create(lp_Node);        //很多人以为的创建

    printf("iNum  = %d\n", lp_Node->iNum);
    printf("pNext = %d\n", lp_Node->pNext);

    system("pause");

    return 0;
}

欢迎大家与我一起探讨实时渲染技术~~
2015-03-25 20:05
n0noper
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:39
专家分:159
注 册:2015-3-21
收藏
得分:0 
回复 3楼 孤独的守候
你完全理解错了我的意思。
我写这个目的,是现在论坛上很多人都在学链表,然后创建头结点的时候,就是这么创建,所以导致失败。
并且我前边也说过,这是错误的师范。
还有一点,你说传一个NULL指针做参数,严格说,这是错误的说法。看得出你应该不怎么熟悉反汇编,你也可以调试一下,单步进入内存区间看看。

不骄不躁,不卑不亢;虚怀若谷,宠辱不惊。
2015-03-25 21:36
孤独的守候
Rank: 2
等 级:论坛游民
威 望:1
帖 子:25
专家分:32
注 册:2015-3-25
收藏
得分:0 
回复 4楼 n0noper
实在是sorry~没有看清楚,就急着否定了~~(:逃

欢迎大家与我一起探讨实时渲染技术~~
2015-03-25 23:01
n0noper
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:39
专家分:159
注 册:2015-3-21
收藏
得分:0 
回复 5楼 孤独的守候
没关系,你的精神值得我学习!对我们认为对的事情,敢言而且言之有理!这才是论坛,这才是技术交流!谢谢你,与君共勉!

不骄不躁,不卑不亢;虚怀若谷,宠辱不惊。
2015-03-26 08:04
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
简单来说,指针变量也是变量,传递的时候也是值传递的方式,要修改也是修改变量所指向的那块内存区的值

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2015-03-27 15:51
快速回复:【交流】关于参数传递及修改问题
数据加载中...
 
   



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

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