静态变量

C语言中不同变量的访问方式

主宰稳场 提交于 2020-03-12 07:04:10
C语言中的变量大致可以分为全局变量,局部变量,堆变量和静态局部变量,这些不同的变量存储在不同的位置,有不同的生命周期。一般程序将内存分为数据段、代码段、栈段、堆段,这几类变量存储在不同的段中,造成了它们有不同的生命周期。 全局变量 全局变量的生命周期是整个程序的生命周期,随着程序的运行而存在,随着程序的结束而消亡,全局变量位于程序的数据段。每个应用程序有4GB的虚拟地址空间,在程序开始时系统将这个程序加载到内存中,为其分配内存,这个时候,会根据程序文件的内容,为全局变量分配内存,并为之进行初始化,当程序的生命周期结束时,系统回收进程所消耗的资源,这个时候,全局变量所占的内存被销毁。 下面来看一段具体的代码: int i= 0; int main(int argc, char* argv[]) { printf("%d\n", i); return 0; } 11: printf("%d\n", i); 00401268 mov eax,[i (00432e24)] 0040126D push eax 0040126E push offset string "%d\n" (0042e01c) 从上述的汇编代码中可以看到,i所对应的地址为0x00432e24,在调用全局变量时,使用的是一个具体的地址,但是并没有看对应初始化i变量的反汇编代码,这是因为在程序开始运行之前

学习java第一天总结

点点圈 提交于 2020-03-11 23:46:16
一,java注重大小写,一个源文件中只能(并非必须要有)有一个publick类,这个public类的类名字一定要和文件名是一样的。其中类名首字母要求均大写,而成员变量,局部变量,和静态类内变量都要求单词首字母小写后面单词的首字母要大写,而类方法要求为小写。 二,类型方面, 有六个数字类型(整型:byte(8),short(16),int(32),long(64),浮点型:float(32),double(64))都是有符号的,char为一个16位的字符,使用unicode,boolead类型只有两种结果,默认为false,这样就总共有8种内置基本类型,这些基本类型定义于java.lang中。 另外java还提供引用类型。初始化float时必须加后缀f,初始化double必须加后缀d或D。数组和对象都是引用类型,所有引用类型默认值为null,数组是存放在堆上的。 还有一个void类型 三,关于变量,只有局部变量,类内成员变量,类内静态变量。其中局部变量是没有默认值的,使用时必须要初始化,未初始化无法编译,同时如果只声明,不使用并不会报错。另外两种变量有默认值,都可以在声明或类构造方法中初始化,其中类内静态变量还可以在静态语句块中初始化。对比c++,少了全局变量,静态函数内变量,文件内局部变量。同时java也没有全局函数的概念,一切均在类中。 类内静态变量可以使用classname

【C++】如何接收函数return返回来的数组元素

て烟熏妆下的殇ゞ 提交于 2020-03-11 10:32:49
转自 https://www.cnblogs.com/Wade-James/p/7965775.html   我们知道return语句作为被调用函数的结束,返回给调用者函数值。一般来说,是返回一个函数值,像一个int, double,char等类型的数据,当然也可以是他们的指针。但是当我们遇到要返回很多数怎么办呢?通常想到的是以数组的形式返回,下面就让我们来看看:   通常来说有两种方式:1.通过返回传入数组指针的方式;2.以指针变量作为函数参数,来实现数组的返回。   一、返回传入数组指针的方式   首先我们来看看这种方法所涉及的知识:(1)指针函数。C语言中允许一个函数返回值是一个指针(地址)基本格式是: 基类型 * 函数名(参数列表)(2)静态变量与局部变量。我们知道C语言程序在运行时,操作系统会给其分配内存空间。这段空间主要分为四个区域,分别是 栈取,堆区,数据区,代码区 。那么 静态变量是存放在数据区,作用范围是全局的,在内存中只存储一份 。 局部变量通常放在栈中,随着被调用的函数的退出内存空间自动释放 。 要接收被调函数返回的指针,那么可以使用一个指针变量。关键是被调函数用什么去返回数组的首地址,正如前面所说,被调函数在执行完之后内存空间就被释放。   这里提供三种方法解决这一问题:    1)通过传入一个空的数组头地址,返回这个变量。 //通过返回传入数组的指针的方式

Java 静态变量和静态方法

故事扮演 提交于 2020-03-11 01:06:06
在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量,常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有。 静态成员不依赖于类的特定实例,被类的所有实例共享,就是说 static 修饰的方法或者变量不需要依赖于对象来进行访问,只要这个类被加载,Java 虚拟机就可以根据类名找到它们。 调用静态成员的语法形式如下: 类名 . 静态成员 注意 : static 修饰的成员变量和方法,从属于类。 普通变量和方法从属于对象。 静态方法不能调用非静态成员,编译会报错。 静态变量 类的成员变量可以分为以下两种: 1 . 静态变量(或称为类变量),指被 static 修饰的成员变量。 2 . 实例变量,指没有被 static 修饰的成员变量。 静态变量与实例变量的区别如下: 1 静态变量 运行时,Java 虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。 在类的内部,可以在任何方法内直接访问静态变量。 在其他类中,可以通过类名访问该类中的静态变量。 2 实例变量 每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。 在类的内部,可以在非静态方法中直接访问实例变量。 在本类的静态方法或其他类中则需要通过类的实例对象进行访问。 静态变量在类中的作用如下: 1 . 静态变量可以被类的所有实例共享

java 基础 --- static 本质

坚强是说给别人听的谎言 提交于 2020-03-08 20:41:20
java 基础 --- static 本质 今天遇到了 Static ,想深入了解一下 Static 的具体作用。 一, 静态成员变量和静态方法 Static 是一个用于修饰成员变量和方法的,被其修饰的成员变量/方法被称作静态成员变量/静态成员方法 ,也叫做类变量。既然是被这个关键字修饰,那么注定静态成员变量/方法与普通的成员变量/方法是有区别的。 静态与非静态的区别: 1.static 修饰的成员变量和方法,从属于类。普通变量和方法,从属于对象的。 2.静态修饰的变量/方法的生命周期和类相同,在整个应用程序执行期间都有效。普通成员变量/方法只有在类创建对象后才开始存在的,对象被销毁,他也会被销毁。 3.静态变量/方法可以使用“类名.静态成员”的形式进行调用。非静态变量/方法必须用“对象.变量”来调用。 4.静态变量是全类共享的,普通变量是每个对象单独使用的。 5.在静态方法中不可以使用 this 关键字。 6.在静态方法中不可以直接调用非静态方法 7.在 java 中规定,不能将方法体内的局部变量声明为 static。 二,静态代码块 在类中,用 static 声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。 构造方法用于对象的初始化,静态初始化块用于类的初始化操作。在静态初始化块中,不能直接访问非 static 成员。

@value 注解注入静态变量

前提是你 提交于 2020-03-08 19:39:37
普通变量在使用@value注解时,直接在变量上加 @value 注解,并通过 spring表达式写上想要获取的值,就可以将配置值注入到变量中。但如果是静态变量就无法这样注入,那么静态变量如何通过 @value 注解进行注入,这和spring 注入静态变量相似,需要写一个set方法,spring 通过调用set方法进行注入,并将注入值赋值给静态变量,代码如下 首先需要在使用 @value注解的类上加 @Component 注解,然后在set方法上加 @Value 注解 代码 package com.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class NameUtils { private static String name; @Value("${name}") public void setName(String name) { NameUtils.name = name; } //该方法为了方便测试 public static String name(){ return name; } } yml 文件 测试 来源: CSDN 作者: 悟世君子 链接:

C结构体中不能有静态变量

送分小仙女□ 提交于 2020-03-08 06:55:53
C中struct只是类型声明,没有内存空间的分配,而static变量是需要分配内存的。,所以不能在结构体中定义静态变量 // C中struct只是类型声明,没有内存空间的分配,而static变量是需要分配内存的。 typedef struct Node { //static int count; int num ; struct Node * next ; } Node ; 来源: CSDN 作者: 明月映雪 链接: https://blog.csdn.net/ren_x_guo/article/details/104715344

C语言中static关键字的作用

 ̄綄美尐妖づ 提交于 2020-03-06 12:36:37
static用法: 在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。 1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。 a.在全局区分配内存。 b.如果没有初始化,其默认值为0. c.该变量在本文件内从定义开始到文件结束可见。 2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下: a.该变量在全局数据区分配内存。 b.它始终驻留在全局数据区,直到程序运行结束。 c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。 # include <stdio.h> void fn ( void ) { int n = 10 ; printf ( "n=%d\n" , n ) ; n ++ ; printf ( "n++=%d\n" , n ) ; } void fn_static ( void ) { static int n = 10 ; printf ( "static n=%d\n" , n ) ; n ++ ; printf ( "n++=%d\n" , n ) ; } int main ( void ) { fn ( ) ; printf ( "--------------------\n" ) ; fn_static ( ) ; printf (

单片机内存分配

。_饼干妹妹 提交于 2020-03-05 15:49:45
  谈到内存,我们都会想到PC,对于单片机或者arm来说也是存在内存的,简单的理解是:内存嘛……就是存放东西的地方,只不过这个东西是数据而已,好了,还是把重点放在mcu上面,对于一款mcu来说,在性能描述的时候都会告诉sram,flash的容量大小,对于初学者来说,也不会去考虑和理会这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,仔细想想,代码为什么可以运行,代码量是多少,定义的int、short等等类型的变量究竟是怎么分配和存储的,这些问题都和内存有关系。   首先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash,可以将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。在MDK编译器下可以观察到在代码中这4个量的值,如下图1所示: 图1: 图2:   其中code和RO-data存储在flash中,所以两者之和为单片机中flash需要分配给它们的空间大小(并且等于代码所生成的.bin文件大小),另外RW-data和ZI-data存储在sram中

Linux中的线程局部存储(二)

六月ゝ 毕业季﹏ 提交于 2020-03-05 09:44:05
在 Linux中还有一种更为高效的线程局部存储方法,就是使用关键字__thread来定义变量。__thread是GCC内置的线程局部存储设施 (Thread-Local Storage),它的实现非常高效,与pthread_key_t向比较更为快速,其存储性能可以与全局变量相媲美,而且使用方式也更为简单。创建线程 局部变量只需简单的在全局或者静态变量的声明中加入__thread说明即可。 列如: static __thread char t_buf[32] = {'\0'}; extern __thread int t_val = 0; 凡是带有__thread的变量,每个线程都拥有该变量的一份拷贝,且互不干扰。线程局部存储中的变量将一直存在,直至线程终止,当线程终止时会自动释放这一存储。__thread并不是所有数据类型都可以使用的,因为其只支持POD(Plain old data structure) [1] 类型,不支持class类型——其不能自动调用构造函数和析构函数。同时__thread可以用于修饰全局变量、函数内的静态变量,但是不能用于修饰函数的局部变量或者class的普通成员变量。另外,__thread变量的初始化只能用编译期常量,例如: __thread std::string t_object_1 ("Swift"); // 错误,因为不能调用对象的构造函数 _