请教高手,C语言中,把变量定义在主函数之外和定义在主函数之内有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教高手,C语言中,把变量定义在主函数之外和定义在主函数之内有啥区别?相关的知识,希望对你有一定的参考价值。
如;
include <stdio.h>
int a=1,s=0
void mian()
和
#include <stdio.h>
void main()
inta=1,s=0;
他们之间的区别在哪里?
两者的区别只在于作用域和生存周期。main函数是一个进程的入口,此外,和别的函数无区别。
1、main函数里定义的是局部变量,只是在main函数里有效。
2、如果程序里有多个函数,定义的全局变量在这些函数里都可以使用,而在main中定义的只能在main中使用,其他函数不可以直接调用。
3、题目中的两个程序的区别只在于程序一的a和s变量是全局变量,程序二的a和s变量是局部变量。
4、全局变量是程序的各个函数都可以调用的,而局部变量只在函数内部有效。
扩展资料:
全局变量是编程术语中的一种,源自于变量之分。
变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。
全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。
局部变量(Local variables)指在程序中只在特定过程或函数中可以访问的变量。局部变量是相对于全局变量而言的。在C++、C#、Ruby这些面向对象语言中,一般只使用局部变量。
面向对象编程是现在普遍采用的是软件开发方法,因此无需考虑是局部变量还是全局变量,说到变量,往往都是局部变量。
参考资料:百度百科-局部变量
参考资料:百度百科-全局变量
参考技术A对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在,外部变量用static来声明,则该变量的作用只限于本文件模块。解决方法如下:
1、首先定义指针的方式void (*p2)();//表示指针,p2 = printfwelcome;//函数就是地址。
2、还可以定义指针的方式,p2();//1.直接通过指针名字调用,(*p2)();//2.取内容(*指针名字)。
3、接着输入int (*padd)(int a,int b);padd = add;int ret = (*padd)(1,2);printf("ret=%d\\n",ret)。
4、然后写出printfwelcome函数。
5、最后写出add函数,运行程序就完成了。
参考技术B 定义在主函数外面是全局变量,分配的内存在静态内存,整个工程内都可以访问到他的值,但是优先级低。只有程序退出后才会释放他的内存。冲突的时候优先使用局部变量。定义在函数内的变量时局部变量,分配的是内存堆栈,只有特定的函数内可以访问到,退出函数后自动释放内存堆栈。优先级高本回答被提问者采纳 参考技术C 定义在main()外的为全局变量,在整个程序文件中都可以调用,定义在main()函数内的变量为局部变量,只有在该函数内调用。 参考技术D 前者称为全局变量,后者称为局部变量。二者的主要区别在于作用域和生命周期。
在C语言中用const定义的变量如何修改
我指的是如何用一种间接的方式使得用const定义的变量在程序运行中可以被修改。
关于C的关键字——const的理解和用法const在C中的用法很灵活(相信C++中也一样),个人感觉对之既爱又恨,有时候感觉const很好用,同时又经
常会因为它的优点而犯错,犯错的原因除了粗心之外,另一个更重要的,就是以前对const理解不到位。于是今天
自己写成一篇小总结。如果是初学者,建议好好看一下,相信帮助比较大;如果是高手,请不吝赐教!
上面写了一段废话,就算是小序吧:)接下来就是正文;
一、关于const的具体定义:
——个人感觉很难对它下一个标准的定义,因为的用法很灵活,似乎对它定义后总无法让人能够明白它的
意思,而且容易让人产生误解(也许是偶水平太菜了)。例如,把它有定义:一个能够让变量变成无法修改的常量
的关键字。那么,这样的话,就可能让人误解为只要有const在定义变量里面,那变量就无论怎样都无法修改。这
样的理解是很片面的(下面用法方面将对这问题做探讨)。因此,本人在此不敢对它下定义,其他参考书好象也没
有下定义。
二、关于const的具体作用
——const作用就灵活了,一个表达式中const放置的位置不同,效果可能就不一样了。下面分具体情况分
析(当然,所举的情况并非覆盖全部情况)
A。const最经常的用法
1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.
//Example ->
int FindNum(const int array[], int num, int conut);//声明函数
//code...
int FindNum(const int array[], int num, int count)
int i;
int flag = 1;
for (i = 0; (i < count) && flag; i++)
if (array[i] == num)
flag = 0;
break;
return flag;
//code...
上面这例子中,编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么
,编译器就会报错了。因此,当你不需要也不想修改数组的数据时,最好用const把数组定义为常量数组。
2.const可以用来创建数组常量、指针常量、指向常量的指针等:
const char ch = 'a';
const int a[5] = 1, 2, 3, 4, 5;
const int *p = a; //a是一个数组的首地址.p是指向常量的指针
int * const p = a; //a是一个数组的首地址.p是指针常量;
const int * const p = a; //a是一个数组的首地址。p是指向常量的指针常量
前两种情况很简单,现在着重分析一下后三种用法,因为这3种情况容易出错,偶就有时候怕用错了
刚脆不用const.
——const int *p = a; //p是指向常量的指针,因此,不可以通过给指针赋值来改变数组
//中的数据,例如:
// *p = 10; /*错误*/
// *(p + 2) = 1; /*错误*/
//假如指向常量指针可以改变值,那么,就等于也改变了数组的数
//据了。假如你不理解,偶倒有一个办法让你理解,你就想你和一
//个人绑在一起,有可能你移动了位置而他不跟着你移动吗!哈哈
——int * const p = a; //看这表达式,const的位置和第一个不同吧!他们的用法和作用
//就完全不一样了。这时候p是指针常量,我们知道,指针是指向
//了一个数组的首地址,那么,它的位置就不可以改变了。但是你
//现在应该和第一个表达式比较了,现在的数组并不是常量数组,
//所以数组的数据是可以改变的,而指针这时候它是不可以移动的
//,指向数组第一个数据,所以它可以而且只可以改变数组第一个
//数据的值。这一点请别误解,指针常量只是它的地址不可以改变
//,并不是它指向的内容一定不可以改变,这一点切记!
//好啦。假如你又不理解,偶又有一个比较形象的例子来说明:
//假如有一个固定的人拉着另外一个人的手,注意,固定的人相当
//于他是不可以由其他人来替换的。但是他可以拉其他人的手啊,
//并不一定规定他必须拉同一个人的手啊。现在你应该可以有个比
//较深的印象和理解吧:P
//下面举几个例子帮助理解:
// *p = 2; /*可以*/
// *(p+1) = 10; /*可以*/
// p++; /*不可以*/
——const int * const p = a; //假如前面两种表达式的本质你理解了,这种表达式你来理解根本
//没有问题,const现在有两个,而且一个const的位置是第一种情
//况的位置,第二个const是第二种情况的位置,所以这表达式的功
//能就是前两种情况的作用总合。这里不多说!
//下面举几个例子帮助理解:
// *p = 2; /*不可以*/
// *(p + 2) = 10; /*不可以*/
// p++; /*不可以*/
B。const并不会阻止参数的修改
之所以把这作为一点来谈,就是因为有一些朋友可能会以为在函数参数中用了const就一定不可以改变
参数,这实际上是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下;
#include<stdio.h>
#include<ctype.h>
void ChangeStr(const char *String);
int main(void)
char str[] = "The C programme";
Change(str);
printf(str);
system("Pause");
return 0;
void ChangeStr(const char *String)
char *Source = (char *)String;
while (*Source)
*Source = toupper(*Source);
Source++;
//end
上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而
*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止
参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。
关于CONST的用法和理解本人也就只能说这么多了,当然,很可能有更多高级或者少用的用法,由于水平
和经验有限,确实不能再说些什么。
三、参考文献
——《C primer plus 5th》 参考技术A 首先是处理时间上的不同,#define宏是预处理命令,是在编译前的预处理阶段完成的。而const是在编译阶段完成的。然后是效果上的不同,const会进行严格的类型检查,而#define宏则只是简单的替换,不会进行类型检查。再就是功能上的不同,const一般用来定义文字常量,其功能相对单薄,而#define由于其简便性,可以在许多方面达到意想不到的效果,比如mfc中用到了许多宏完成了复杂的rtti机制,序列化机制,等等。而这些都是const无法达到的效果的。另外#define宏用得比较多的地方就是防止头文件的重复包含了。这一点也是const无法做到的。 参考技术B 指针
两种修改方法
1: int const *pci
指针指向的对象被const成常量,指针本身是整型,可以修改,但不能修改指针指向对象的值。
2: int * const pci
第二种则是这个指针本身被const成常量,指针不能修改,可修改指向的整型。
参考书籍《C和指针》,最好三剑客的书都敲一遍,然后你就悟了... 参考技术C const定义的是常量,运行中不能改,再间接的方式也不能改,这不符合规定。
想改的话就不要定义成const常量
“我指的是如何用一种间接的方式使得用const定义的变量在程序运行中可以被修改”,不知道你用的是何种间接的方式,贴出来分离一下??
以上是关于请教高手,C语言中,把变量定义在主函数之外和定义在主函数之内有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章