十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这个fp是局部变量,没有办法和其他函数共享,可以使用的解决方法为:
创新互联主要从事成都网站制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务莱阳,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
1、声明为全局变量,不过的确不好
2、作为参数传递,这样要增加一个形参
书上说不可以,我质疑了,我自己试了下,下面代码是正确的,我在VC++6.0和Cfree5.0运行都是正确,没有出现任何错误!!1
#include stdio.h
union data
{
int i;
char c;
float f;
}a;
union data f1(int n)
{
union data dd;
dd.i=n;
return dd;
}
union data f1(union data d)
{
union data dd;
dd.i=d.i;
return dd;
}
int main()
{
int n=10;
union data d,qq,ss;
d.i=20;
qq=f1(d);
ss=f1(n);
printf("%d %f %d\n",qq.i,qq.f,qq.c);
printf("%d %f %d\n",ss.i,ss.f,ss.c);
return 0;
}
把变量定义在主函数之外,即把变量设置为全局的。
一般我们都把变量的定义放在函数中,因此变量的范围就是在本函数中。可是如果定义在所有函数的外面,这样所有的函数中,都可以使用本变量。
你可以试一下这个程序。定义一个全局变量a,在主函数中进行赋值,然后在子函数中进行输出,结果是5.
#includestdio.h
int a;
void func();//函数声明
int main()
{
a=5;
func();
}
void func()
{
printf("%d\n", a);
}
+++++++++++++++++++++++++++++++++++++++++++++++++++
当然,除了定义全局变量这个方法,还有其他的方法,那就是指针。在子函数的参数中传递变量的地址,依然可以使用该变量,依然能够改变该变量的值。因为主函数和子函数的变量共用的是同一个地址的变量,因此,不管在哪个函数中对变量进行操作,都会影响变量。
比如下面这个程序,在主函数中a的值为5,将变量a的地址传递过去,子函数将该地址中的变量的值设置为3,然后主函数输出,结果却是3.
#includestdio.h
void func(int *b);//函数声明
int main()
{
int a=5;
func(a);//把变量a的地址传递过去
printf("%d\n", a);
}
void func(int *b)
{
*b=3; //将地址b中变量的值设置为3
}
已经有人给你那么多方法了。。。我还是建议不要用extern去使全局变量,也不要把变量定义在头文件,然后用include把变量包含进其它源文件使用,不要这样做!这是菜鸟的做法!
正确的做法是这样的,你把变量定义在相应的源文件中,定义成全局的,然后写一个接口去读取,充分利用封装的思想!我举个例子哈:
加入你的变量名是 A,定义在abc.c中。。。
这时候你的正确做法是 在abc.c中写一个函数,命名为 int GetAValue(void) { return A; }
这才是大神的做法!这样的话如果是在同一个源文件中,可以直接访问全局变量达到目的。如果是在不同的源文件的其它函数,就调用你写好的 GetAValue()函数去读取!
如果所有函数都在同一个.c文件中。只需要在文件开始的地方定义变量就可以了。
....
int g_test;
main()
{
....
}
fun1()
{
....
}
fun2()
{
....
}
如果是要在多个.c文件中的所有函数使用同一个变量。
可以用 extern声明。
file.c
int g_int;
main()
{
。。。。。
}
对于工程中的其他文件,想访问这个全局变量可以用
extern int g_int ;声明
这样就可以用了
所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:
union 共用体名
{成员表列};
union data
{
int a ;
float b;
doublec;
chard;
}obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
运行程序输出:
15,8
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。
可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。
main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为:
6
6 7.2
3 4.2,=
程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。