数组、函数

一.解释堆和栈的区别

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

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

1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其  
  操作方式类似于数据结构中的栈。  

2、堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回  
  收   。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的  
  全局变量和静态变量在一块区域,   未初始化的全局变量和未初始化的静态变量在相邻的另  
  一块区域。   -   程序结束后由系统释放。  

4、文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放  

5、程序代码区—存放函数体的二进制代码。  

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

static全局变量只初始化一次,防止在其他文件单元中被引用;

static局部变量只被初始化一次,下一次依据上一次结果值;

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

四.局部变量能否和全局变量重名?

能,局部会屏蔽全局。要用全局变量,需要使用 ":: " (域解析符)。

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


五.关键字static的作用是什么?


1.在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。


2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。注意,只有在定义了变量后才能使用。如果变量定义在使用之后,要用extern 声明。所以,一般全部变量都会在文件的最开始处定义。


3.在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。


六.可以把另外一个地址赋给一个数组名吗?

不可以,尽管在一个很常见的特例中好像可以这样做。

数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。

假如一个数组是用extern或static说明的,则它的数组名是在链接时可知的一个常量,你不能修改这样一个数组名的值,就像不能修改7的值一样。

给数组赋值是毫无根据的。一个指针的含义是“这里有一个元素,它的前后可能还有其他元素”,一个数组的含义是“这是一个数组中的第一个元素,它的前面没有数组元素,并且只有通过数组下标才能引用它后面的数组元素”。因此,假如可以使用指针,就应该使用指针。


七.数组作为参数传递给函数时,可以通过sizeof得到数组的大小吗?

不可以。当把数组作为函数的参数时,无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。这意味着把数组传递给函数的效率非常高,也意味着程序员必须通过某种机制告诉函数数组参数的大小。


八.C语言对数组处理非常有效的原因

1.除少数编译器出于谨慎会做一些繁琐的规定外,C语言的数组下标是在一个很低层次上处理的。

2.数组和指针能非常和谐的在一起工作。使用指针要比使用数组下标快两倍。


void func(chara [max])
{
     /*.....*/
}
void func(char *a)
{
     /*.....*/
}
3.这种情况正是前文中提到的第三个优点。这也是唯一一种数组和指针完全相同的情况,在其他情况下,数组和指针并不完全相同。


九.字符串和数组有什么不同?

数组的元素可以是任意一种类型,而字符串是一种特别的数组,它使用了一种众所周知的、确定长度的规则。


十.声明与定义的不同

函数的声明就是声称一个函数的名字,不涉及函数的实现,即没有函数体,所以函数的声明只包含三个部分。

函数的定义就是确定一个函数的意义,即让函数具有某项功能,但是这里可不是只有函数体,你总是要指明这个函数体是哪个函数的吧,所以函数的定义包含了一个函数的所有部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值