| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1361 人关注过本帖, 1 人收藏
标题:关于结构体的一点疑惑
只看楼主 加入收藏
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
结帖率:96.55%
收藏(1)
已结贴  问题点数:50 回复次数:19 
关于结构体的一点疑惑
程序代码:
好久没有接触c语言了,偶尔看到一个关于结构体的程序,代码如下:其中有两个函数,我明显觉得函数func2比函数func1要简洁,更容易懂,但为什么很多代码上要用函数func1这种形式,形参要用指针的指针,不是更难懂了吗?                     难道是我忘了什么重要的东西?
#include <stdio.h>
#include <stdlib.h>
typedef struct temp
{
    int e;
}*TEMP;
void func1(TEMP *x)
{
    printf("(*x)->e=%d\n",(*x)->e);
    printf("x=%d\n",x);
}
void func2(TEMP x)
{
    printf("(x)->e=%d\n",(x)->e);
    printf("x=%d\n",x);
}
int main()
{
    TEMP m=(TEMP)malloc(sizeof(struct temp));
    m->e=5;
    func1(&m);
    func2(m);
    return 0;
}
搜索更多相关主题的帖子: 结构体 c语言 
2013-10-25 21:18
pokerLee
Rank: 2
等 级:论坛游民
帖 子:41
专家分:29
注 册:2012-11-4
收藏
得分:0 
func2形参不是指针么~~还能用变量定义么?
2013-10-25 21:43
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
很好的对比例的
2013-10-25 21:51
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:0 
正有此迷惑,还有链表有些操作函数的返回类型,相同功能的函数,有的是返回结构体指针,这还好理解。某些返回的是 ok(1),此时为什么不是一个void返回呢,当然有些是空返回。不过应该是函数还没有深刻领悟。

[ 本帖最后由 qunxingw 于 2013-10-25 22:53 编辑 ]

www.qunxingw.wang
2013-10-25 22:51
rchunjiang
Rank: 4
来 自:大连
等 级:业余侠客
帖 子:42
专家分:262
注 册:2013-10-25
收藏
得分:0 
fun1和fun2在上面提到的小程序上在功上没多大差别,但对于复杂的程序,fun1有一定的优越性,
2013-10-25 23:31
rchunjiang
Rank: 4
来 自:大连
等 级:业余侠客
帖 子:42
专家分:262
注 册:2013-10-25
收藏
得分:0 
fun1和fun2在上面提到的小程序上在功上没多大差别,但对于复杂的程序,fun1有一定的优越性。一方面,当temp结构体中定义了很多成员,而你又想在函数fun1处理的过程中改变对象m中的某些成员的值,而不是仅仅使用对象m的某些成员值,这时fun1能办到改变对象m的某些成员的值,而fun2办不到,因为函数fun2在被调用时传给它的参数是m的一个拷贝副本;另一个方面就是函数调用时的参数的传递,对fun2而言,在调用时需要拷贝一个m,压栈以备fun2使用,而fun1只需将m的地址(即指向m的指针)进行压栈以备fun1使用(当然这也会有其他方面的额外消耗),处理起来也方便许多。以上仅仅是我本人编程过程中总结的,并非准确答案,仅供参考。
2013-10-25 23:54
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
哈哈,终于看到一个比较有意思的帖子,就不知道有没有那个能力解释解释一下呢
明天谈谈我的看法

思考赐予新生,时间在于定义
2013-10-26 00:23
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
收藏
得分:0 
回复 6楼 rchunjiang
我个人的想法如下,不知道对不对.
1,用func2也能改变m的值,因为m本身就是一个地址值,如下所示:
   
程序代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct temp
{
    int e;
}*TEMP;
void func1(TEMP *x)
{
    printf("(*x)->e=%d\n",(*x)->e);
}
void func2(TEMP x)
{
    printf("(x)->e=%d\n",(x)->e);
    x->e=7;
}
int main()
{
    TEMP m=(TEMP)malloc(sizeof(struct temp));
    m->e=5;
    func1(&m);
    func2(m);
    printf("(m)->e=%d\n",(m)->e);
    return 0;
}
结果为:
(*x)->e=5
(x)->e=5
(m)->e=7
2,m和&m都是地址的值,所以…………


[ 本帖最后由 佳嘉 于 2013-10-26 09:04 编辑 ]
2013-10-26 09:02
佳嘉
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:534
专家分:1383
注 册:2009-11-8
收藏
得分:0 
回复 4楼 qunxingw
我觉得返回ok或者false,是看函数是否达到了预想的执行效果
2013-10-26 09:17
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:0 
我也觉得函数func2比函数func1要简洁,也习惯func2形式
2013-10-26 10:52
快速回复:关于结构体的一点疑惑
数据加载中...
 
   



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

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