第一个printf不用说打印的就是a的元素;说说b,b=a把a赋给b;gender和score不用说;name是个指针,所以复制给b的也是个指针,a的name和b的name指向同一块类存地址,然后调用f();函数把b的name指针传递进去,在f()函数中开辟一块空间并把这块空间的地址赋给b的name指针,f()函数结束后,在f()中开辟的空间并未消失信稿尺了,f()函数中b。name指针是局部的,f();结束后b的name指针在栈中被释放滑高了,所以b。name和a的name指正还是一样的,
第二段代码就选a;
在struct stu中name是个字符数组,在创建stu的一个对象后,就有空间储存字符,b=a;你懂的
然后调用f()函数,把qian写入b的name的那块空间,空间中的字符串就变为了qian,
正好有个现成的:#include"stdio.h"#define yes 1
#define no 0typedef struct date
{
int year
int month
int day
}DATE
long timedef(DATE d1,DATE d2)
int leap(int year)
int main()
{
DATE date1,date2
date1.year=2008
date1.month=11
date1.day=1
date2.year=2009
date2.month=12
date2.day=1 printf("%ld\n",timedef(date1,date2))}
int leap(int year)
{
if(year%400==0 ||(year%4==0&&year%100!=0))
return yes
else
return no
}
long timedef(DATE d1,DATE d2)
{
int i
long day=0,dayt1=0,dayt2=0
int d[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}}
for(i=d1.yeari<d2.yeari++)
if(leap(i)==no) day+=365
else day+=366 for(i=1i<d1.month++i) dayt1+=d[leap(d1.year)][i]
dayt1+=d1.day for(i=1i<d2.month++i) dayt2+=d[leap(d2.year)][i]
dayt2+=d2.day return day+dayt2-dayt1
}
union是用来定义联合体的关键字,union维护足够的空间来置放多个资料成员中的最大的“一种”,而不是为每一个资料成员配置空间,在union中所有的资料成员共用一个空间,同时间只能储存其中一个成员的资料。可以得出该共用体在内存中占用4个字节。
k.a[0]=10000k.a[1]=15000为k的int a[2]成员赋值,即该内存的内容是[00111010] [10011000] [00100111] [00010000]将这4个字节换算成符点数就是0.001161.
scanf ("%s",k.d)//k.d[]="abcd"
因为scanf把4个输入压栈后再出栈对4个字符变量赋制值,则内存结构为纤做:
[01100100] [01100011] [01100010] [01100001]
d[3] d[2] d[1] d[0]
c(4个字节)
b(前两个字节)
a[1](前两个字节)a[0](后两个字节)
将这4个字节换算成符点数c就是:16777999408082104400000.000000.
至于上面的数字是怎么得来的,那要考虑浮点数在计算机中的储存结构问题了.在存储1个浮毁猜衡点数的32位内存中,
第一位是符号位,下来的8位是指数位,后面的23位是尾数位.
[01100100] [01100011] [01100010] [01100001]
换算成浮点数的算法是:
第一位为0:正数
下来的8位是:[11001000],减去[01111111]为[1001001].所以指数为73
再下来的23位是1100011[01100010] [01100001].所以尾数为
(1.11000110110001001100001)B = 2^0+2^(-1)+2^(-1)+2^(-6)+2^(-7)+2^(-9)+2^(-10)+2^(-14)+2^(-17)+2^(-18)+2^(-23).
最后兆此结果=底数^指数
可能你还会问为什么位数一样,结果还是有差距,那是因为浮点数的计算精度问题.浮点数的精度是有限的.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)