考点关键词
关键字:static、局部变量、全局变量
1、static全局变量与普通全局变量、static局部变量和普通局部变量、static函数与普通函数有什么区别?
本质上:是对内存模型的考察。可以从内存分配空间、使用范围解答。
static全局变量与普通全局变量:
首先,内存分配位置不同,虽然都在静态全局数据区,但是static修饰的全局变量在.bss文件中,全局变量在.data文件中。
其次,使用范围不同,static修饰的全局变量使用范围是在本文件中,外部文件不可以使用;全局变量不仅本文件中可以使用,其他文件也可以使用。
static局部变量和普通变量:
首先,内存分配位置不同,static修饰的局部变量在静态全局数据区,局部变量在栈区。
其次,使用范围不同,static修饰的局部变量只初始化一次,下一次依据上一次结果值,局部变量的使用范围是在函数定义开始到结束为止。
static函数与普通函数:
首先,内存分配位置不同,static函数在静态全局区,普通函数在静态全局区。
其次,
static全局变量只初始化一次,防止在其他文件单元中被引用;
static局部变量只初始化一次,下一次依据上一次结果值;
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
2、全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?
不可以,应该在源文件中定义。头文件可能会重复包含,可能会被多次定义。为什么会被多次定义,你没有加头文件宏定义吗?
3、局部变量能否和全局变量重名?
可以,但是最好不要这样命名。在局部变量的作用域内,是局部变量的处理。其余是全局变量的作用范围。
4、如何在其他文件引用一个已经定义过的全局变量?
extern
关键词堆栈,内存管理
1、stack与heap的差别
首先介绍栈空间和堆空间,再说明他们的差别。
栈空间由操作系统自动分配/释放,空间有限;堆空间是手动分配/释放,堆上有很大的自由存储区;
程序在编译期对变量和函数分配内存、程序运行过程中函数调用时参数的船体都在栈上进行。
堆空间是存储动态分配
栈空间是存储局部变量和函数参数
2、堆栈溢出的原因
应该怎么分析?什么原因会造成栈空间爆满?栈存储的是局部变量,也就说局部变量一直在被定义
栈溢出:
死循环或者递归太深,递归的原因,可能太大,也可能没有终止。
死循环,会重复定义函数中的变量,造成内存爆满。
堆溢出:不断malloc空间,一直创建新的对象,没有free。
关键词:指针、数组、函数
unsigned char *p1;
unsigned long *p2;
p1 = (unsigned char *)0x801000;
p2 = (unsigned long *)0x810000;
请问p1 + 5 = ? ; p2 + 5 = ?;
p1是指向无符号char类型的指针 unsigned char 1字节 所以p1 + 5 = 0x801005
p2是指向无符号long类型的指针 unsigned long 4字节 所以p2 + 5 = 0x801014
main ()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d,%d\n",*(a + 1), *(ptr - 1)); // 2 5 为什么是5
return 0;
}
2 是数组名加一 加的是4字节 2的地址
为什么是5?ptr指向int类型的指针
此题主要是区分 (a + 1) 和(&a + 1)的区别。
下面这个程序执行后会有什么错误或者效果:
#include <stdio.h>
#define MAX 10
int main()
{
unsigned char A[MAX],i;
for (i = 0; i <= MAX; i++)
{
A[i] = i;
}
return 0;
}
循环了11次,而数组的空间只有10大小。到第11次赋值,会数组越界。数组下标0到MAX-1
位运算
1、请写出求2的3次方最快的方法
int number = 2;
number << 3;
2、交换两个变量的值,不使用第三个变量。即a = 3, b = 5,交换之后a = 5, b = 3
这个不会。这个应该不是交换,是直接改变原先的值。通过异或运算
宏定义
1、用宏定义写出swap(x,y)
#define swap(x,y) ((x) = (x + y), (y) = (x - y), (x) = (x - y))
#define swap(x,y) (x)^=(y)^=(x)^=(y)
2
#define add(a,b) a + b
int main()
{
printf("%d",3*add(4,7)); //19
}
数据结构应用
简述怎么用两个栈实现一个队列的功能?
写一个函数判断一个字符串里的小括号、大括号是否匹配。
栈应用:四则运算器
实现单链表逆置
排序
实现冒牌排序
手写快速排序。复杂度?给定 1,4,5,5,8,9,7,在快排中两个5是否会被交换?
给定一个含有n个正整数的整型数组,请你将n个数的顺序重新排列,给出可能得出的最大正整数。
比如给定数组(555,53,5),则最大正整数55355