菜单

C语言变量的初始化【402.com】

2019年8月3日 - 计算机教程

   c语言中 支持 结构体间的整体附值。

在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是‘\0’。不妨做个小实验验证一下。


//Example 3

     事实上,除了在同一个文件定义的全局对象的初始化是按照定义次序来进行的之外,其他全局或静态变量之间的初始化次序没有任何保障。解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问,例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}   
    
   
这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。

void fn()


转载:http://www.cnblogs.com/yc\_sunniwell/archive/2010/07/14/1777441.html

    例如:全局变量
    int a = 5;
    int b = a;
    如果a,和b定义在同一个文件里,那没什么问题,结果b等于5.
   
如果a和b定义在不同文件里,就不能保证b也等于5,也就是说不能保证a先初始化.

static int n; //定义静态全局变量

    注意:千万不要写出和编译顺序相关的程序来。

用法2:局部静态对象

  1. 全局变量的初始化

int main(void) {

 

return 0;  }

     对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。

再次编译运行程序,细心体会全局变量和静态全局变量的区别。

关于全局变量的初始化,C语言和C++是有区别的。      
   在C语言中,只能用常数对全局变量进行初始化,否则编译器会报错。       
   在C++中,如果在一个文件中定义了int a = 5;要在另一个文件中定义int b =
a;的话,前面必须对a进行声明:extern int
a;否则编译不通过.、即使是这样,int b =
a;这句话也是分两步进行的:在编译阶段,编译器把b当作是未初始化数据而将它初始化为0;在执行阶段,在main被执行前有一个全局对象的构造过程,
int b = a;被当作是int型对象b的拷贝初始化构造来执行。    
   其实,准确地说,在C++中全局对象、变量的初始化是独立的,如果不是象int
a = 5;这样的已初始化数据,那么就是象b这样的未初始化数据。    
  
而C++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。

{

   
任何时候,如果在不同的被编译单元中定义了”非局部静态对象”,并且这些对象的正确行为依赖于它们被初始化的某一特定顺序,就会产生问题.你绝对无法控制不同被编译单元中非局部静态对象的初始化顺序.对于函数中的静态对象(即”局部”静态对象)它们在函数调用过程中初次碰到对象的定义时被初始化..  

2) 其它文件中可以定义相同名字的变量,不会发生冲突;

另:

通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但是有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。  静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下

     此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。
     1,尽量不用全局变量
     2,用静态变量,通过访问器进行访问

//Example 1

{

3.
static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区

int i;

B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

void main()

(4)
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝.

用法3:静态成员和静态成员函数

char a = ‘A’; // global variable

(1) static
函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c.
下面是a.c的内容:

}

iii ) 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;

静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。

{

extern int n;

printf(“integer: %d; string: (begin)%s(end)”, a, str);

n++;

下面是main.c的内容:

1  10

int a;

2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

类的静态成员函数只能访问类的静态成员(变量或函数)。

}

static char str[10];

fn();

1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

int n; //定义全局变量

//Example 2

int fun(void){

#include 

void msg() { printf(“Hello\n”); }

3   8

变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

n++;

cout<

return 0; }

#include <stdio.h>

4   7

void main()

1.先来介绍它的第一条也是最重要的一条:隐藏

(2)、静态局部变量

}

printf(“%d\t\t%d\n”, count, fun());

  1. C++的static

n=20;

void fn()

如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

void fn();

//File1

栈区

int main(void) {

如果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。同理,一个需要访问类成员,而不需要针对特定对象去调用的函数,也被称为一个static成员函数。

编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。试着将

ii ) 
未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);

C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

static int n; //定义静态全局变量

cout<

#include 

void main()

改为

程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:

}

静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。

7   4

您可以将上述示例代码改为如下:

int count = 1;

fn();

A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图