简答(1)

1.关键字static的作用是什么


我:

(1),修饰全局变量,改变其作用域,只能在本文件使用。

(2),修饰函数,改变其作用域,只能在本文件中调用。

(3),修饰局部变量,改变变量的生命周期,直至程序结束才会释放。

书:

简单来说static修饰变量,就是指该变量空间独立于函数中的auto变量(auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存。)或者栈变量,static变量空间在内存中的静态区(全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放)内分配。

一般情况下,局部变量是放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束为止。但在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期和存储空间发生了变化,但其作用域并没有改变,其仍然是一个局部变量,作用域仅限于该语句块。

对于一个全局变量,它既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(只需用extern进行声明即可)

用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。

网:

(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其在下次调用时仍维持上次的值;  

(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。


2.局部变量能否和全局变量重名


函数的形参变量只有在被调用期间才能分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能在使用了。这种变量有效性的范围称为变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 


局部变量会屏蔽全局变量,要使用全局变量需要使用“::”


3.static全局变量、局部变量、函数与普通变量、局部变量、函数有什么区别


static全局变量和函数,改变了他们的作用域,只能对本文件使用,即使用extern的外部声明也不行


static局部变量:延长了局部变量的生命周期,直至程序结束

普通变量:只执行一次



4.程序的内存分配,即由C/C++编译的程序占用的内存分为几个部分


内存分配方式有三种

(1)从静态存储区分配。

内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量等。

(2)在栈上创建。

在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算使用内置于处理器的指令集,效率很高,但分配的内存容量有限。

(3)从堆上分配,亦称为动态内存分配。

程序在运行时使用malloc或new申请所需要内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存空间由程序员决定,使用非常灵活,但问题也最多。

全局变量和static变量是程序整个程序所需要用到的,单独分出一块存储区保存,在程序的整个运行程序期间该存储区存储的数据不清空;局部变量在函数退出时自动清空,放在栈里进行临时存储。用指令new和malloc分配的内存需要自己在堆中手动申请并用free和delete指令手动释放。

1、栈区(stack)由编译器自动分配释放,在不需要的时候自动清除。用于存放函数的参数、局部变量等。操作方式类似数据结构中的栈2、堆区(heap)一般由程序员分配释放,若程序员分配后不释放,程序结束后可能由OS回收。不同于数据结构中的堆,分配方式有些类似链表。3、全局区(静态区)——全局变量和静态变量存储在这里。程序结束后由系统释放。在以前到C语言中,全局变量又细分为初始化的(DATA段)和未初始化到(BSS段),在C++里已经没有这个区分了,它们共同占用同一块内存区。4、常量存储区——常量字符串就存放在这里。一般不允许修改。程序结束后由系统释放。5、代码区——存放函数体的二进制代码。




一、堆栈空间分配区别:
  1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
  2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
二、堆栈缓存方式区别:
  1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
  2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三、堆栈数据结构区别:
  堆(数据结构):堆可以被看成是一棵树,如:堆排序;
  栈(数据结构):一种先进后出的数据结构。






1. AndroidManifest.xml文件中activity标签主要描述了应用程序的Activity组件的信息,包括Activity的名称、图标、主题、启动模式、导航方式、屏幕方向、权限等。 2. Intent组件适合在需要两个或多个组件之间进行通信或交互的场合使用,例如启动另一个Activity、启动Service、发送广播等。 3. Service启动和停止的要求如下: - 启动Service:需要通过startService()方法来启动Service。 - 停止Service:需要通过stopService()方法来停止Service。 - Service需要在AndroidManifest.xml文件中进行注册。 - Service需要重写onStartCommand()方法或onBind()方法,以响应启动请求。 4. 在安卓应用程序中通过Java代码访问SQLite数据库有以下三种方式: - 使用SQLiteOpenHelper类:通过继承SQLiteOpenHelper类,实现数据库的创建、升级等操作。 - 使用ContentProvider类:通过ContentProvider类,对外提供对SQLite数据库的访问接口,可以实现跨进程访问数据库。 - 使用android.database.sqlite包中的API:通过该包中的API,实现对SQLite数据库的基本操作,包括创建表、查询、插入、更新、删除等操作。 5. 安卓中两种常用的多线程实现方法如下: - 继承Thread类:通过继承Thread类并重写run()方法,实现多线程操作。 - 实现Runnable接口:通过实现Runnable接口并重写run()方法,实现多线程操作。相对于继承Thread类,实现Runnable接口的方式更加灵活,因为Java只允许单继承,而实现Runnable接口可以同时实现其他接口。 两种方法的特点如下: - 继承Thread类:使用起来比较简单,但是会占用一个线程资源,如果需要多个线程,则需要创建多个Thread对象,占用更多的系统资源。 - 实现Runnable接口:相对于继承Thread类,实现Runnable接口的方式更加灵活,可以实现多个线程共享一个Runnable对象,从而减少系统资源的占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值