网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月18日漏签0天
c语言吧 关注:801,195贴子:4,371,116
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 首页 上一页 1 2
  • 28回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

回复:关于“结构体做函数参数 传递的是 什么?”的看法

  • 只看楼主
  • 收藏

  • 回复
  • 追忆曾经_
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
其实我觉得这种问题 暂时不用考虑 毕竟改变不了


  • EAgleLeo
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
luoji是在灌水,,,
我就经常被嘲 谁叫我小白呢....


2025-11-18 00:02:31
广告
不感兴趣
开通SVIP免广告
  • 追忆曾经_
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
前两天在CSDN看一贴特别逗 也挺对.. 程序员的十层楼。。


  • EAgleLeo
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
良化已经是大牛了阿
........................
我还是个小小小小菜鸟.....


  • 追忆曾经_
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
......


  • 初学C入门
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
C语言中结构体作为函数参数时传递的应该是结构体的值,而不是地址。
看下面的程序及对应的汇编代码:

对应的汇编代码如下:



  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果你的截图里的内容正确的话 ,的确是传得结构体的值

先把结构体内的两个变量push再调用call 但是你的编译器比较老吧 怎么还是16位的、、
用32位的编译器试试!


  • 初学C入门
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不会吧,跟这个有关吗?gcc32位编译器下:



2025-11-17 23:56:31
广告
不感兴趣
开通SVIP免广告
  • 初学C入门
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
相互研讨而已,没必要这么自责


  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
结果没有结构体没有备份;
直接调用Student xiaoma的地址
上图:

然后调用call
我就知道我错了。。
c语言里高手深藏不露 就我一个菜鸟在这里吓装逼
谢谢22楼的提醒了
以后可耻的匿了!
吧主把这个贴删了吧。。。我错了。



  • gtgt154
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这样也能学习的,以防自己的想法和楼主一样,反正现在我很晕,慢慢参透


  • A清时明月
  • 路人
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主想证明:结构体做函数参数是值传递,可是为什么最后又把函数形参改为了指针???
void PrintStudent(Student *student)
{
printf("%d\n",student->number);
printf("%s\n",student->name);
printf("%d\n",student->age);
……
PrintStudent(&xiaoma);//这里明显是“址传递”啊!
我不是计算机专业的,只能勉强看懂16位的8086和MCS51的汇编,不过这事用C语言就证明嘛。
#include "stdio.h"
typedef struct __point{
int x;
int y;
}point,*ppoint;
void setxy(point P);
main()
{
point P1={1,1};
setxy(P1);
printf("P1(d%,d%)",P1.x,P1.y);
}
void setxy(point P)
{
P.x=0;
P.y=0;
}
如果输出是"P(1,1)",则是传值方式,形参只是实参的副本,形参的变化不影响实参;
如果想改变子函数以外的值,我觉得至少有4种方法:用return,指针,C++的引用,最后就是直接用全局变量(当然不要被子函数覆盖,也就是说子函数中(包括形参)不能有同名局部变量)。
如果输出是"P(0,0)",则可能就是传址了!(我没测试^_^)
不过,要是数组做函数入口参数的话,一定是址传递,数组的首元素地址(这里要注意:多维数组要把它看成一维数组处理:char a[2][3]={"abc","def"};传递的地址是"abc"的地址,而不是'a'的地址,尽管两者相等,意义不同,你懂的!)



  • cgqlove
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
天! 反复看了几遍,还是弄不明白到底是传副本地址还是传副本值。木办法,谁叫我汇编差呢,完全看不懂。谁能告诉我参数压栈了多少个,捧起汇编语言内牛满面……


  • Fly逐月
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include<string.h>
typedef struct{char name[9];char sex;int score[2];}STU;
STU f(STU a)
{
STU b={"Zhao",'m',85,90};
int i;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++)
a.score[i]=b.score[i];
return a;
}
void main()
{
STU c={"Qian",'f',95,92},d;
d=f(c);
printf("%s,%c,%d,%d,",d.name,d.sex,d.score[0],d.score[1]);
printf("%s,%c,%d,%d,",c.name,c.sex,c.score[0],c.score[1]);
}

值传递。



登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 首页 上一页 1 2
  • 28回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示