结构体名是否代表结构体首地址的问题

aiwoziji13 2010-12-23 12:33:15
数组名代表的是数组的首地址,比如int a[10]; printf("%d\n", a); //打印的数组的首地址

那么结构体名是否代表结构体的首地址?
1.
struct csdn {
int a;
char b;
} CSDN = {2, 3};
...
printf("%d\n", csdn);//打印结果是2
这样看的话应该结构体名不是代表结构体的首地址

但是,
2.
struct s_tag {int a[100];};
struct s_tag orange, lime, lemon;
struct s_tag twofold(struct s_tag s) {
int j;
for (j=0; j<100; j++)
s.a[j]*=2;
return s;
}
main(){
int i;
for(i=0, i<100; i++)
lime.a[i]=1;
lemon=twofold(lime);
orange=lemon; /*给结构体赋值*/
}
这里有几个疑问:1)lemon=twofold(lime); 此语句中的结构体名lime代表什么?
2)orange=lemon; 此语句怎么理解?
...全文
6109 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
aweiname2008 2011-09-16
  • 打赏
  • 举报
回复
printf("%d",csdn)这个函数第二个参数就是要地址的,你用printf("%s",csdn);输出的就是地址了
所以结构体变量的名字就是首地址!
chlaws 2010-12-23
  • 打赏
  • 举报
回复
值拷贝
Shrek_MyCpp 2010-12-23
  • 打赏
  • 举报
回复
1) 参数传入的是整个结构体,入栈空间为int + char(不考虑对齐),不是首地址。
2) 是结构体内容赋值,不是首地址。此时你观察一下两个结构的首地址,就可以看到了。
bdmh 2010-12-23
  • 打赏
  • 举报
回复
对于你这个,是将数组内容拷贝
aiwoziji13 2010-12-23
  • 打赏
  • 举报
回复
那赋值 是将结构体的首地址赋值 还是将结构体中所有的内容进行赋值
justkk 2010-12-23
  • 打赏
  • 举报
回复
两个相同类型的结构体变量是可以直接赋值的。
  • 打赏
  • 举报
回复
看8楼!
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 freethinkingspace 的回复:]
结构体名只是声明某个结构体起的名字,它代表的是声明的结构体。
结构体的变量名代表的是该结构体实例的首地址
[/Quote]
误导人了!哥们!
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 aiwoziji13 的回复:]
结构体的变量名代表的是该结构体实例的首地址
这句话正确吗 有可以验证的例子么

struct csdn {
int a;
char b;
} CSDN = {2, 3};
...
printf( "%d\n ", csdn); //为什么打印结果是2 ,而不是地址值?



引用 7 楼 freethinkingspace 的回复:
结构体名只是声明……
[/Quote]

这句话是错的!你还说!!!不要听他的!
aiwoziji13 2010-12-23
  • 打赏
  • 举报
回复
结构体的变量名代表的是该结构体实例的首地址
这句话正确吗 有可以验证的例子么

struct csdn {
int a;
char b;
} CSDN = {2, 3};
...
printf( "%d\n ", csdn); //为什么打印结果是2 ,而不是地址值?


[Quote=引用 7 楼 freethinkingspace 的回复:]
结构体名只是声明某个结构体起的名字,它代表的是声明的结构体。
结构体的变量名代表的是该结构体实例的首地址
[/Quote]
  • 打赏
  • 举报
回复

这里有几个疑问:1)lemon=twofold(lime); 此语句中的结构体名lime代表什么?
2)orange=lemon; 此语句怎么理解?

1、lime是一个结构体类型,一个构造类型!独立类型!这个类型大小就是sizeof(lime)这么大,此题中为4*100个字节!记住,这是struct类型的大小为400【固定的】,同int等类型都一样有了固定大小!400就是固定大小!

2、当一种struct类型作为参数传递后,那么他同一个内置类型传递是一样的!一个int整形传递时,拷贝了4个字节(32位系统固定大小)!同样,struct类型也要拷贝他的固定大小,400!
PS:所以很多时候,为了速度上的需要,对于构造类型,都建议传递指针(32位4个字节),因为这样传递要减少很多的拷贝!

3、对于同种的类型的构造struct类型,同内置类型一样!可以赋值!两个int整形可以赋值,同样同种struct类型也一样!这里的赋值也是对400个内存大小进行值拷贝!

希望有帮助!有错请纠正!
ithinking 2010-12-23
  • 打赏
  • 举报
回复
结构体名只是声明某个结构体起的名字,它代表的是声明的结构体。
结构体的变量名代表的是该结构体实例的首地址
  • 打赏
  • 举报
回复 3
这里有几个疑问:1)lemon=twofold(lime);   此语句中的结构体名lime代表什么? 
2)orange=lemon; 此语句怎么理解?

1、lime是一个结构体类型,一个构造类型!独立类型!这个类型大小就是sizeof(lime)这么大,此题中为4*100个字节!记住,这是struct类型的大小为400【固定的】,同int等类型都一样有了固定大小!400就是固定大小!


2、当一种struct类型作为参数传递后,那么他同一个内置类型传递是一样的!一个int整形传递时,拷贝了4个字节(32位系统固定大小)!同样,struct类型也要拷贝他的固定大小,400!
PS:所以很多时候,为了速度上的需要,对于构造类型,都建议传递指针(32位4个字节),因为这样传递要减少很多的拷贝!

3、对于同种的类型的构造struct类型,同内置类型一样!可以赋值!两个int整形可以赋值,同样同种struct类型也一样!这里的赋值也是对400个内存大小进行值拷贝!

希望有帮助!有错请纠正!

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧