全局变量和 局部变量的区别?
当有外部变量时,main函数中的变量也是局部变量马?如果没有外部变量?main函数里的变量就是全局变量把?intmax(intx,inty){intz;z=x>y?x:y...
当有外部变量时,main函数中的变量也是局部变量马?
如果没有外部变量?main函数里的变量就是全局变量把?
int max(int x,int y)
{int z;
z=x>y?x:y;
return(z);
}
main()
{extern A,B;
printf("%d\n",max(A,B));
}
int A=13,B=-8; 这个例子中外部变量在最后.但是因为它的存在.main中的变量也是局部变量马?
如果没有extern说明 main里的变量还是局部变量把? 展开
如果没有外部变量?main函数里的变量就是全局变量把?
int max(int x,int y)
{int z;
z=x>y?x:y;
return(z);
}
main()
{extern A,B;
printf("%d\n",max(A,B));
}
int A=13,B=-8; 这个例子中外部变量在最后.但是因为它的存在.main中的变量也是局部变量马?
如果没有extern说明 main里的变量还是局部变量把? 展开
10个回答
展开全部
最佳回答有错误。extern是声明。声明和定义都分不清就不要误导别人了!
问题其实很简单,函数{}里的是局部变量,反之是全局变量,和extern无关。
问题其实很简单,函数{}里的是局部变量,反之是全局变量,和extern无关。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
全局变量是自变量会影响因变量,而局部变量只是影响部分因变量。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
都有外部变量是变量和局部变量是有区别的l
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你定义变量的时候是定义的数据空间你操作变量的时候是对,空间存入的串操作(当然设计运算还有其他类型)你在哪里定义的变量就继承哪里的空间可见度,一个程序或者WIN下的一个pe含有一个main的主空间(dll不解释了:被动型pe)和其他所有子程序的空间,main的数据空间是其他所有子程序可见的,子程序空间互相不可见,如涉及的参数的传入传出(传递),可以方便定义到全局即可,你在子程序里可读取和写入主程序的数据空间,不同进程(PE文件)可以依靠缓冲区首地址进行堆栈或队列甚至是链式的块数据传送,对于小于32/64/128位空间数据可以用串传送,貌似winapi是用eax传送返回数据,调用参数需要事先在全局空间里声明
变量编译后是如何在内存中被寻址的呢:现在流行的什么动态语言和什么静态语言,其实是使用静态物理空间的方式方法的不同而已静态语言比较严格,不易出错,动态语言是采用类似咱们的虚拟内存的方法,来回倒腾而已,有个假的就像是寻址空间上限的地址空间。
pe文件(2进制可执行文件)的节对应系统的不同内存。你的工程文件在被编译或解释执行的时候整个源文件扫描出来的空间定义(常变量声明)不论位于那个位置(源文件是单维度顺序走下来的)都会放到数据区,你对变量的操作,会放到代码区如mov,inc ,串操作等。那么寻址是怎么解决的呢?都是以偏移offset来的包括主子程序的入口点。编译的时候是以静态的4大家都一样的空间,加载到内存时就会按页加载并 修改偏移量。
那么在内存中是怎么知道 寻找变量a和变量b的地址呢?也就是说我如果调用插件或api甚至工程本体的程序并需要寻址时候怎么弄,这就是在编译的时候已经把所有的标识符包扩程序子程序命中等等只要是标识符,一概用地址替换。这也对应了如果你要调用其它pe的子程序,你需要事先声明,例如:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
这是带返回值的函数,所以要在本体进程内流出返回值的空间,编译的后并执行时就会被加载的函数使用该空间地址
如你的源文件可能是这样 mov a,b
编译后在反编译你会看到 mov 12345678,87654321
别在一我的语法就是这个意思,所以不同的pe节放在不同的内存空间,不同的数据可见度放在不同的内存空间,所以你的读写会受保护和受限制
我基本上喜欢一概用全局。基本上不涉及多线程的话不需要太在意,除非你是大工程,尤其需要注意内存回收则可多利用动态的局部变量
如果你要问sub和fuctiong函数和非函数,主要区别是形式上函数带返回值。
编译后就没有什么函数不函数了,机器指令就两大类 jump类(有无条件)call(配合ret也可盗取堆栈里的返回地址。。)
PS:多线程和互联网也尤其涉及该问题,互斥锁是门学问,尤其是互联网编程,互斥和负载均衡。
变量编译后是如何在内存中被寻址的呢:现在流行的什么动态语言和什么静态语言,其实是使用静态物理空间的方式方法的不同而已静态语言比较严格,不易出错,动态语言是采用类似咱们的虚拟内存的方法,来回倒腾而已,有个假的就像是寻址空间上限的地址空间。
pe文件(2进制可执行文件)的节对应系统的不同内存。你的工程文件在被编译或解释执行的时候整个源文件扫描出来的空间定义(常变量声明)不论位于那个位置(源文件是单维度顺序走下来的)都会放到数据区,你对变量的操作,会放到代码区如mov,inc ,串操作等。那么寻址是怎么解决的呢?都是以偏移offset来的包括主子程序的入口点。编译的时候是以静态的4大家都一样的空间,加载到内存时就会按页加载并 修改偏移量。
那么在内存中是怎么知道 寻找变量a和变量b的地址呢?也就是说我如果调用插件或api甚至工程本体的程序并需要寻址时候怎么弄,这就是在编译的时候已经把所有的标识符包扩程序子程序命中等等只要是标识符,一概用地址替换。这也对应了如果你要调用其它pe的子程序,你需要事先声明,例如:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
这是带返回值的函数,所以要在本体进程内流出返回值的空间,编译的后并执行时就会被加载的函数使用该空间地址
如你的源文件可能是这样 mov a,b
编译后在反编译你会看到 mov 12345678,87654321
别在一我的语法就是这个意思,所以不同的pe节放在不同的内存空间,不同的数据可见度放在不同的内存空间,所以你的读写会受保护和受限制
我基本上喜欢一概用全局。基本上不涉及多线程的话不需要太在意,除非你是大工程,尤其需要注意内存回收则可多利用动态的局部变量
如果你要问sub和fuctiong函数和非函数,主要区别是形式上函数带返回值。
编译后就没有什么函数不函数了,机器指令就两大类 jump类(有无条件)call(配合ret也可盗取堆栈里的返回地址。。)
PS:多线程和互联网也尤其涉及该问题,互斥锁是门学问,尤其是互联网编程,互斥和负载均衡。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询