C语言全局变量定义方法

C语言全局变量定义方法
C语言全局变量定义方法

C语言全局变量定义方法

(2011-11-25 21:11:28)

转载▼

标签:

分类:C语言

杂谈

今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义过全局变量啊,但是先前怎么没错误?瞎折腾了一会最后还是发现问题出在细节上面了。以前只是侥幸没遇到而已。今天做个总结,以后再忘记了就回来直接查一下。

我们都知道定义在函数外部的变量就叫做全局变量,但是通常只有一个C文件和一个H文件的时候那样定义是不会出问题的。一个大的系统会包含好多个.C文件和.H文件,每个.C文件都有可能会访问全局变量,所以全局变量在定义的时候就要稍微做下改变了。通常的做法是建立一个包含系统所有全局变量的.H文件,系统用到的所有全局变量都定义在该文件内,文件名可以用Global修饰一下。在该文件中定义某个全局变量的时候需要用extern声明该变量为外部变量。比如要定义SysEventCounter标志为unsigned char型的全局变量可以这样定义:

extern unsigned char SysEventCounter; <----这里是关键,不能对该变量赋值,只能声明,赋值就会报错。

上述声明是写在.H文件中的。其他.C文件若要用到该变量,直接包含该.H文件就可以了

如果想要赋初值,可以在用到它的.C文件中这样写:

unsigned char SysEventCounter = 0;

不用赋初值时,直接

unsigned char SysEventCounter;

就可以了。注意:只需要在一个.C文件中写即可,其他.C文件直接可以用。如果在其他.C 文件中也这样写会产生重复定义的错误。

全局变量对变量的类型不限制,任何类型都可以,只要按照上述方法定义就不会有错误。

c语言选择题

1.以下运算符中优先级最低的是(C)。 A、&& B、| C、|| D、& 2.不合法的if语句是:(D) A、if(表达式) 语句1 else 语句2 B、if(表达式) 语句 C、if(表达式1)语句1 else if(表达式2)语句2 else 语句3。 D、if 关系表达式语句1 else 语句2 3.以下不是无限循环的语句为(D)。 A、while(1){x++;} B、for(;;x++=i); C、for(i=10;;i--) sum+=i; D、for(y=0,x=1;x>++y;x=i++) i=x; 4.调用函数时,基本类型变量做函数参数, 实参和对应的形参(B). A、不占用存储单元 B、各自占用独立的存储单元 C、同名时才能共用存储单元 D、共占用一个存储单元 5.已知有宏定义#define F(a) a*(a+2),则F(4+3)的值为(D). A、24 B、15 C、63 D、31 a[10]; 给数组a的所有元素分别赋值为1、2、3、……的语句是(D) A、for(i=1;i<11;i++)a[i]=i; B、for(i=1;i<11;i++)a[0]=1; C、for(i=1;i<11;i++)a[i+1]=i; D、for(i=1;i<11;i++)a[i-1]=i; 7.若有说明:int a[3][4];则数组a中各元素(A)。 A 、不能得到确定的初值B、可在程序的编译阶段得到初值0 C、可在程序的运行阶段得到初值0 D、可在程序的编译或运行阶段得到初值0 8. 已定义float a; int i;选择正确的输入语句(C). A、scanf("%6.2f%3d", &a,&i); B、scanf("%f%s", &a,&i); C、scanf("%6f%3d",&a,&i); D、scanf("%f%d", a,i); 9 执行下面程序段后,k的值是:(B) int k=2; switch(k+1) { case 3:k+=1; case 4:k--;break; case 5:k*=3; case 6:++k;} A、10 B、2 C、28 b D、27 11.以下程序段中,能够正确地执行循环的是(B)。 A、int s=6; m:if(s<100) exit(0); else s-=2; goto m: B、int s=6; do s-=2; while(s); C、for(i=1;i>10;i++) D、static int a; while(a) 12.运行结果是" 11 12"的程序段是:请在A处填写正确内容(B)。 for(i=1;i<=2;i++) ___A___ A、for(j=1;j<=2;j++)printf("%3d",10*i+j);break; B、{for(j=1;j<=2;j++) printf("%3d",10*i+j);break;} C、for(j=1;j<=2;j++)printf("%3d",10*i+j);continue; D、{for(j=1;j<=2;j++)printf("%3d",10*i+j);continue;} 13.设有以下定义: int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=a; 则数值为6的表达式是(D). A、p+5 B、*p+6 C、*(p+6) D、*p+=5 14. 语句printf("a\bre\'hi\'y\\\bou\n");的输出结果是(B)(说明:'\b'是退格符)。 A、a\bre\'hi\'y\\\bou B、re'hi'you C、a\bre\'hi\'y\bou D、abre'hi'y\bou 14.执行下面程序段后,i的值是(A).

static全局变量与普通的全局变量有什么区别

(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。 (2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。 (3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。 Static全局变量与普通的全局变量有什么区别: 1.static全局变量只初使化一次,防止在其他文件单元中被引用; 2.static局部变量只被初始化一次,下一次依据上一次结果值; 3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝 const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。C 编译器总是为其分配相应的存储单元。 在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。 在C++中,还可以修饰类的成员函数,不改变类中的数据成员. 被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 char * const p; //常量指针,p的值不可以修改 char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了就终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序: const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1)const变量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试(不能用指针指向宏)。 因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到调用函数的下一行代码继续执行。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。 而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。 但是宏也有很多的不尽人意的地方。 1)、宏不能访问对象的私有成员。 2)、宏的定义很容易产生二义性。

局部变量全局变量静态局部变量静态全局变量的异同

局部变量、全局变量、静态局部变量、静态全局变量的异同 2011-01-18 10:16 完成内容: 1.收获备忘; 2.局部变量、全局变量、静态局部变量、静态全局变量的异同; 3.设计函数atoi()(字符串转int型) 4.含参数的宏与函数的优缺点; 一.收获备忘 1.数组名指向的是一块内存块,内存的地址与大小在生命期内不可改变,只有内存块中的内容可以改变;指针可以随时指向任意类型的内存块; 2.strcpy()函数的原型:char *strcpy(char *strDestination, const char *strSource); malloc()函数的原型:void *malloc(size_t size); free()函数的原型:void free(void *memblock); 3.指针在free()或delete后,需重新指向NULL,或指向合法的内存; 4.申请动态内存后,应该马上判断是否申请成功(malloc和new 申请动态内存不成功返回NULL),若申请不成功,则用exit(1)强制退出程序; 5.内存分配的三种方式: (1).从静态存储区域分配:变量在编译时已经分配好,在整个程序运行期间都存在,例如:全局变量,静态全局变量; (2).从“栈”上分配:函数内的局部变量,在使用时自动从栈上创建内存区域,函数结束时自动释放。由于栈上内存的分配运算内置于处理器的指令集中,使用效率很高,但容量有限; (3).从“堆”上分配:即动态内存分配,程序员可使用malloc ()/new申请任意大小的动态内存空间,同时由程序员决定何时使用free ()/delete去释放已申请的内存。使用起来十分灵活,但最容易出问题;

C语言中条件运算符的语法为

条件运算符的语法为: (条件表达式)?(条件为真时的表达式):(条件为假时的表达式) 例如: x=ay?"greater than":x==y?"equal to":"less than" 它等价于: (x>y)?"greater than":((x==y)?"equal to":"less than") 当x>y时,值为"greater than",x==y时,值为"equal to",否则,值为"less than"。条件运算符的嵌套可读性不够好。 在一个条件运算符的表达式中,如果后面两个表达式的值类型相同,均为左值,则该条件运算符表达式的值为左值表达式。例如: int x=5; long a,b; (x?a:b)=1;//ok:因为a和b都是左值 (x?x:a)=2;//error:x和a不同类型。编译器将其解释为(1ong)x和a (x==271:a)=3;//error:1非左值 "(x?a:b)=1"表示当x为0时,b=1,否则a=1。这里的括号是必须的,否则将被看作x?a:(b=1)。"(x?x:a)=2”中,尽管x是左值,a也是左值,但x与a不同类型,条件运算符要对其进行操作数的隐式转换,使之成为相同的类型。任何被转换的变量都不是左值。 ->在C中,条件运算符是不能作左值的,所以"(x?a:b)=1;"将通不过编译。 getchar 函数名: getchar 功能: 从stdio流中读字符 用法: int getchar(void); 注解:

变量和函数与静态动态局部和全局

计算机C语言核心知识点-变量和函数变量可以在程序中三个地方进行说明: 函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同, 变量可分为局部变量、形式参数和全局变量。从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分的可以有静态存储变量和动态存储变量之分。 一.全局变量和局部变量 C语言中广泛使用局部变量来进行相关的存储的运算。在一个函数模块中定义的变量成为局部变量,我们一般在进入函数的地方进行局部变量的定义,局部变量在定义的时候需要被赋予初始值,否则会是系统被分配的随机值。局部变量的作用范围在函数体内部,每次进行函数的调用的时候,则进行局部变量的定义和分配内存单元。也就是说随着被调用函数体的结束,局部变量会自动消失,内存空间会释放。所以我们可以再不同的函数模块中去定义相同的局部变量。他们之间互相不会影响,在执行完某个函数的时候,会释放相应的存储单元,其他的函数单元也能进行重新定义和开辟存储空间。我们如果要使用函数体内部生成的布局变量的话,一般是通过静态变量来实现。 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。 局部变量从存储方式上可分为动态(auto)存储类型和静态(static)存储类型。 动态存储类型的局部变量都是动态的分配存储空间,数据存储在动态存储区(栈)中。函数调用结束后自动释放,生存期是在声明该变量的函数执行过程。 静态存储类型的局部变量则是静态的分配存储空间,数据存储在静态存储区中。在程序整个运行期间都不释放,生存期贯穿于程序运行的整个过程。 函数中的局部变量,如不专门声明为static存储类别,默认都是动态地分配存储空间的,我们在平时的声明变量的过程中auto都是默认省略的。 C语言中也会广泛使用全局变量来进行运算。全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。 全局变量的特点如下: 1. 在程序执行整个过程中它们占据固定的存储单元,而不动态地进行分 配和释放; 2. 如果外部变量不在文件的开头定义,其有效作用域只限于定义处到文 件终。也就是说文件中,在全局变量定义之前的地方需要使用全局变

c语言选择结构试题带答案

1. 以下非法的赋值语句是 A: n=(i=2,++i); B: j++; C: ++(i+1); D: x=j>0; 2. 已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-1 && y+z/2 的值是A: 6 B: 0 C: 2 D: 1 3. 阅读以下程序: main() { int x; scanf(“%d”,&x); if(x--<5) printf(“%d”,x); else printf(“%d”,x++); } 程序运行后,如果从键盘上输人5,则输出结果是()。 A: 3 B: 4 C: 5 D: 6 4. 有如下程序 main0 { int a=2,b=-1,c=2; if(a main()

a=c/100%9; b=(-1)&&(-1); printf("%d,%d\n",a,b); } 输出结果是( )。 A: 2,1 B: 3,2 C: 4,3 D: 2,-1 6.两次运行下面的程序,如果从键盘上分别输入6 和4,则输出结果是main( ) { int x; scanf("%d",&x); if(x + + >5) printf("%d",x); else printf("%d\n",x - -); } A: 7 和5 B: 6 和3 C: 7 和4 D: 6 和4 7. 能表示x 为偶数的表达式是 A: x%2==0 B: x%2==1 C: x%2 D: x%2!=0 8. 下面的程序段中共出现了几处语法错误? int a,b; scanf("%d",a); b=2a; if(b>0) printf("%b",b); A: 1 B: 2 C: 3 D: 4 9. C 语言中,逻辑“真”等价于 A: 大于零的数 B: 大于零的整数 C: 非零的数 D: 非零的整数

堆与栈,静态变量和全局变量的区别

堆与栈,静态变量和全局变量的区别 堆与栈,静态变量和全局变量的区别 对和栈的主要的区别由以下几点: 1、管理方式不同; 2、空间大小不同; 3、能否产生碎片不同; 4、生长方向不同; 5、分配方式不同; 6、分配效率不同; 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。 空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。 注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。 碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。 生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

C语言基础练习题(含答案)

目录

第1-3章 C语言基础知识习题 1 选择题 1. 以下不是C语言的特点的是()。 A、语言简洁紧凑 B、能够编制出功能复杂的程序 C、C语言可以直接对硬件操作 D、C语言移植性好 2.下列字符序列中,不可用作C语言标识符的是()。 A.abc123 B.no.1 C._123_ D._ok 3.正确的C语言标识符是()。 A._buy_2 B.2_buy C.?_buy D.buy? 4. 请选出可用作C语言用户标识符的一组标识符()。 A.void B.a3_b3 C.For D.2a define _123 -abc DO WORD IF Case sizeof 5. 下列符号中,不属于转义字符的是()。 A.\\ B.\0xAA C.\t D.\0 6.不属于C语言关键字的是()。 A.int B.break C.while D.character 7.是C语言提供的合法关键字的是()。 A.Float B.signed C.integer D.Char 8.以下不能定义为用户标示符的是()。 A.scanf B.Void C._3com_ D.int 9.一个C程序是由()。 A.一个主程序和若干子程序组成 B.一个或多个函数组成 C.若干过程组成 D.若干子程序组成 10. C语言程序的基本单位是()。 A.程序行 B.语句 C.函数 D.字符 11.下列说法中,错误的是()。 A.每个语句必须独占一行,语句的最后可以是一个分号,也可以是一个回车换行符号B.每个函数都有一个函数头和一个函数体,主函数也不例外 C.主函数只能调用用户函数或系统函数,用户函数可以相互调用 D.程序是由若干个函数组成的,但是必须有、而且只能有一个主函数 12.以下说法中正确的是()。 A.C语言程序总是从第一个定义的函数开始执行 B.在C语言程序中,要调用的函数必须在main( )函数中定义 C.C语言程序总是从main( )函数开始执行

C、C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

C、C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别 static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 面向过程设计中的static 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。 Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

C语言选择题

一、多项选择共31题(共计310分) 第1题(10.0分)题号:4 以下选项中,合法的字符常量是()。 A:'\t' B:'\17' C:"n" D:'\xaa' 答案:ABD 第2题(10.0分)题号:3 以下用户标识符,其中合法的是()。 A:return B:f2_G3 C:A3-3 D:abc 答案:BD 第3题(10.0分)题号:14 以下可以定义为用户标识符的有()。 A:scanf B:short C:_3com_ D:int 答案:AC 第4题(10.0分)题号:8 以下选项中合法的表达式是()。 A:0<=x<100 B:i=j==0 C:(char)(65+3) D:x+1=x+1 答案:ABC 第5题(10.0分)题号:10 以下不符合C语言语法的实型常量是()。 A:1.2E0.5 B:3.14.159E C:.5E-3 D:E15 答案:ABD 第6题(10.0分)题号:5 以下叙述中正确的是()。 A:一个C源程序可由一个或多个函数组成 B:一个C源程序必须包含一个main()函数 C:C源程序的基本组成单位是函数 D:在C源程序中,注释说明只能位于一条语句的最后答案:ABC

第7题(10.0分)题号:20 以下正确的if语句形式是()。 A:if (x>y && x!=y); B:if (x==y) x+=y; C:if (x!=y) scanf("%d",&x) else scanf("%d",&y); D:if (x0); D:if(b==0) m=1;n=2; 答案:ABC 第12题(10.0分)题号:6 设有以下定义 int a=0; double b=1.25; char c='A'; #define d 2 则下面语句中正确的是()。 A:a++;

全局变量和局部变量

全局变量与局部变量的区别 2009-11-15 10:12 一、变量的分类变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。静态全局变量,只本文件可以用。 全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束.省略了存储类型符,系统将默认为是自动型. 静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存. 自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的. 二、介绍变量的作用域 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。 一、局部变量 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。 例如: int f1(int a) /*函数f1*/ { int b,c; …… }a,b,c作用域

局部变量、全局变量、堆、堆栈、静态和全局

局部变量、全局变量、堆、堆栈、静态和全局【】 预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 ?栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。 ?堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 ?全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。- 程序结束后有系统释放 ?文字常量区—常量字符串就是放在这里的。程序结束后由系统释放 ?程序代码区—存放函数体的二进制代码。 一个正常的程序在内存中通常分为程序段、数据端、堆栈三部分。程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。 在内存中,它们的位置如下: +------------------+ 内存低端 | 程序段| |------------------| | 数据段| |------------------| | 堆栈| +------------------+ 内存高端 堆栈是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,PUSH和POP。PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。 在高级语言中,程序函数调用、函数中的临时变量都用到堆栈。为什么呢?因为在调

C语言赋值表达式

C语言赋值表达式 一、赋值运算符 1:赋值运算符 赋值运算符的符号位“=”,由赋值运算符组成的表达式称为赋值表达式。功能:先求出右边表达式的值,然后把此值赋给左边的变量。 格式:变量名=表达式 说明:在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋给的那个数据。 2:赋值表达式 例如:a=2+3 就是一个赋值表达式 使用赋值表达式应注意以下几点: a:赋值运算符的优先级只高于逗号运算符,比其他的运算符的优先级都要低,且具有自右向左的结合性。 b:赋值运算符不是数学中的等号,而是进行赋予的操作。 c:赋值表达式a=b的作用是将变量y所代表的的存储单元中的内容赋给变量x所代表的存储单元,x中原有的数据被替换掉。 d:赋值运算符的左侧只能是变量,不能是常量或表达式。 e:赋值运算符右边的表达式也可以说一个赋值表达式。 f:在c语言中,“=”被视为一个运算符,x=12是一个表达

式。 3:赋值语句 在赋值表达式的尾部加一个“;”,就构成了赋值语句。 例如:a=2+3;就是一个赋值语句。赋值语句必须在最后出现分号,分号是语句中必不可少的部分,c语言规定赋值运算符的左边不能为常量或表达式。 二、复合赋值表达式 在赋值运算符之前加上其它运算符可以构成复合赋值运算符。在c语言中共有10种复合赋值运算符,其中与算术运算符有关的复合运算符有:+=、-=、*=、/=。两个运算符之间不能有空格。复合赋值运算符的优先级与赋值运算符的优先级相同。三、赋值运算中的类型转换 如果赋值运算符两侧的数据类型不一致,在赋值前系统将自动先把右侧表达式求得的数值按赋值运算符左边变量的类型进行转换,也可以用强制类型转换的方式人为地进行转换后将值赋给赋值运算符左边的变量。 在c语言的表达式中,如果运算符两边的整型类型不相同,系统将自动地进行类型转换,规则如下: A:当赋值运算符左边的变量为短整型,右边的值为长整型变量,短整型只能接受长整型变量低位上两个字节中的数据,高位上的两个字节中的数据将丢失; B:当赋值运算符左边的变量为无符号整型,右边的值为有

字符串指针和字符数组,静态全局、静态局部、全局和局部变量区别,字符串常量和字符串变量,程序的内存分配

最近工作之余,发现了两个自己在C语言学习中的难点,一个是字符串指针和字符数组的区别,一个就是静态全局变量、静态局部变量、全局变量和局部变量的区别,在网上查了不少资料,收获良多,现在与大家分享,有错误的地方请大家指正! 以下程序用VC++6.0调试 先说说字符串指针和字符数组的区别 1.相同点: /* 用字符数组实现字符串操作*/ main( ) { char str[]="Welcome to study C !"; int i; printf("%s\n",str); for (i=0;i<=7;i++) printf("%c",str[i]); //用*(str+i)也行 printf("\n"); } /* 用字符指针实现字符串操作*/ main() { char *str="Welcome to study C !"; int i; printf("%s\n",str); for(i=0;i<=7;i++) printf("%c",*(str+i)); //用str[i]也行 printf("\n"); } 2.不同点: a)赋值方式不同,字符数组只能对各个元素分别赋值,而字符指针只需赋给字符串的 首地址就可以了。 如: char *str; str="Welcome to study C !"; 以下对字符数组的赋值是错误的: char str[80]; str[ ]="Welcome to study C !"; b)字符指针指向字符串,"hello"是一个字符串常量,与之相关联的内存空间位于内 存的只读部分,如: char ch[] = "china\n"; char *p; char *pp = "CHINA\n"; p = ch; *(p+2) = 'h';//就是可以的 *(pp+2) = 'h';//此处在编译时不会出错,在执行的时候会出错

CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区 别 static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 面向过程设计中的static 全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。 局部变量也只有局部作用域,它是自动对象(auto),它在程序运行

期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。 静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。 从分配内存空间看: 全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一

C语言中《赋值运算》

3.1复合赋值运算 算术运算符―+ —* / %‖和赋值运算符―=‖结合起来,形成复合赋 值运算符。如下所示: +=:加赋值运算符。如a+=3+1,等价于a=a+(3+1)。 -=:减赋值运算符。如a-=3+1,等价于a=a-(3+1)。 *=:乘赋值运算符。如a*=3+1,等价于a=a*(3+1)。 /= :除赋值运算符。如a/=3+1,等价于a=a/(3+1)。 %= :取余赋值运算符。如a%=3+1,等价于a=a%(3+1)。 复合赋值运算符的作用是先将复合运算符右边表达式的结果与 左边的变量进行算术运算,然后再将最终结果赋予左边的变量。所以 复合运算要注意: 一、是复合运算符左边必须是变量; 二、是复合运算符右边的表达式计算完成后才参与复合赋值运算。 复合运算符常用于某个变量自身的变化,尤其当左边的变量名很 长时,使用复合运算符书写更方便。 Eg 1:赋值运算符的演示: #include void main() { int nA=10; int nB=10; printf("%d\t",nA+=nA-=nA*nA); printf("%d ",nB+=nB-=nB*=nB); } 运行结果: -180 0 3.2自增自减运算 自增运算符和自减运算符 自增和自减运算符是C++语言所特有的,主要用于给一个变量加 1或减1。自增和自减运算符及其功能如下: + +:自增运算符。如a++; ++a;都等价于a=a+1。 - -:自减运算符。如a- -; - -a;都等价于a=a-1。 自增运算符和自减运算符可以放到变量前面(前置方式)或者后 面(后置方式),这两种方式同样实现了变量的自增或自减运算。但 是当变量的自增运算或者自减运算同其它运算符配合构成一个表达 式时,前置运算时变量先做自增或自减运算,再将变化后的变量值参 加表达式中的其它运算。后置运算时变量在参加表达式中的其它运算 之后,再做自增或自减运算。

全局变量过多的坏处

全局变量过多的利弊(整理) 最近看了一个嵌入式工程代码。发现模块之间的全局变量很多, 而且调用特别频繁。 问题:请问各位高手,这样全局变量多会引起什么问题? 全局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。 2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少。 3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。 总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使期名字易于理解,而且不能太短,避免名字空间的污染;避免使用巨大对象的全局变量。局部变量:在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。 全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。 局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。 4.提高了耦合性,牵一发而动全身,时间久了,代码长了,你都不知道全局变量被哪些函数改过,更怕全局的、起标志作用的变量,处理不好会被害死,同理外部变量比之更甚,尽量不用。不过不是绝对的,如果有清理的逻辑,和必要的时候使用这两种变量会是很好的解决方法。 5.提高了模块间的耦合性,对后期维护、扩展和复用都带来极大影响。 比如说你想在新的系统中复用旧系统的模块,你就会发现由于全局变量的存在,单个旧模块极难单独剥离出来; 维护上来说,模块之间的全局变量,你会常常发现修改代码功能时,不同功能对同一全局变量的操作上经常发生冲突。。。 呵呵,这些问题,你维护过一段时间这些代码就有体会了 如果对此类问题感兴趣,推荐去看看《代码大全2》,里面对全局变量的使用有很好的建议;

全局变量和静态局部变量有什么区别

全局变量和静态局部变量有什么区别? 存储的地方是一样的,不同之处在于它们的作用域不同: 全局变量基本上在程序的任何地方都能被看到 而静态局部变量只能在其指定的范围内被使用 比如 int i ; // 全局变量 class C { public: static int i_C; // 静态局部变量 } void main() { i = 1; // 合法 i_C = 1; // 错误 C::i_C = 1; // 合法 C cc; cc.i_C = 2; // 合法 } 2、 全局变量具有外部连接性,即同一工程中其它文件中的也可引用。 而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。如: //cpp1.cpp extern int x=10; static int y=5; //cpp2.cpp #include void main() { extern int x; extern int y; cout<

将这两个文件放在同一工程中,你发现每一文件单独编译能通过,但作为工程不能构成.exe 文件运行。若将有关变量y的行注释后(或将static换成extern)就可以了。这是因为静态变量的作用域在本文件内,不能扩充到其它文件。其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。 3、静态局部变量 在局部变量前加上“static”关键字,就成了静态局部变量。静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其初始化为0。 静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作的运行结果也不同。

以下合法的C语言赋值语句是哪个

一、选择题 1、下面程序的输出是______ main() { int k=11; printf("k=%d,k=%o,k=%x\n",k,k,k); } A.k=11,k=12,k=13 B.k=11,k=13,k=13 C.k=11,k=013,k=oXb D.k=11,k=13,k=b 2、以下合法的C语言赋值语句是哪个?______ A.a=b=58 B.k=int(a+b) ; C.a=58,b=58 D.i; 3、以下程序的输出结果是______ main() { int x=10,y=3; printf(“%d\n”,y=x/y); } A.0 B. 1 C. 3 D.不确定 4、若变量已正确说明为int类型,要给a,b,c输入数据,以下正确的输入语句是______ A.read (a,b,c); B.scanf(“%d%d%d”,a,b,c); C.scanf(“%D%D%D”,%a,%b,%c); D.scanf(“%d%d%d”,&a,&b,&b); 5、执行下面程序段后,c3中的值是______ int c1=1 , c2=2 , c3; c3=c1/c2; A.0 B.1/2 C.0.5

D. 1 6、若执行以下程序段,其输出结果是______ int a=0 , b=0 , c=0; c=(a-=a-5) , (a=b,b+3) ; printf(“%d , %d , %d\n” , a,b,c); A.3,0,-10 B.0,0,3 C.-10,3,-10 D.3,0,3 7、若有以下定义和语句: int a=5; a++; 此处表达式a++的值是______ A.7 B. 6 C. 5 D. 4 8、在C语言中,如果下面的变量都是int类型,则输出结果是______ sum=pad=5; pad=sum++,pad++,++pad; printf("%d\n",pad); A.7 B. 6 C. 5 D. 4 9、以下程序的输出结果______ #include main() { int i=010,j=10; printf("%d,%d\n",++i,j--); } A.11,10 B.9,10 C.010,9 D.10,9

相关文档
最新文档