函数返回值的接受过程,也是拷贝
函数返回值如果没有变量接收,也会随着函数执行完而被销毁
int func(int *p){}
int *p;
func(p);//func(p)改变不了p的值,因为是int *型的值传递,若想改变p的值,需定义成int func(int **p){};调用时写成func(&p)
函数设计时,要保证函数的返回值指向的不是局部变量,因为如果是,在函数结束时,函数已被销毁,返回值指向的为内容为空;
如果函数返回值指向的是只读区、静态数据段(静态区的内容会放到数据段)、堆区的内容,那么可以
常量表达式,例如1+2、365*24*3600等,在编译后他们的值就已经确定下来,不用计算后再赋值
面试题:
1.#define SECONDS_OF_YEAR (365*24*3600)UL
加ul是为了保证在所有的设备中都能运行,为了可移植性,有的设备出问题可能就是类型没有定义明确。有的设备的int为16位,这样上面的数据可能就放不下了,此时会发生数据的丢失
2.int(*a[10])(int);//变量名先与右边的符号结合,遇到方括号是数组,遇到圆括号是函数
3.static的作用
static用来修饰局部变量,该变量就保存在静态数据区,生存周期直到程序结束
用来修饰全局变量,防止重命名,限制变量名只在本文件内有效
用来修饰全局函数,防止重命名,限制函数名只在本文件内有效
4.const的含义:只读,只是简易性,不具备强制性;const在c++中是常量
5.volatile的含义:防止编译器的优化;它修饰的变量,可能通过第三方(例如用户)修改
6.对变量或寄存器进行位操作
unsigned int a;
a |= (0x1<<3);
a &= ~(0x1 << 3);
7.对一个整型变量的地址赋值,如果该地址是函数,怎样调用该函数?
int *p = (int *)0xaa22;
*p = 0x1122;//或p[0] = 0x1122
*((int *)0xaa22) = 0x1122;
*((void (*)(void))0xaa22)();