c语言基础笔试坑点
1、#define N 5 + 5
求 k = N*N*5
错误解法:10*10*5 = 500
正解(重点:注意黄色部分):5 + 5 * 5 + 5 * 5 = 55
2、死锁的必要条件:
1、相互排斥使用(资源独占)
一个资源每次仅仅能给一个进程使用
2、不可强占(不可剥夺)
资源申请者不能强行的从资源占有者手中夺取资源,资源仅仅能由占有者自愿释放
3、请求和保持(部分分配,占有申请)
一个进程在申请新的资源的同一时候保持对原有资源的占有(仅仅有这样才是动态申请,动态分配)
4、循环等待
存在一个进程等待队列
{P1 , P2 , … , Pn},
当中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路
3、地址偏移:
int arr[6] = { 1,2,3,4,5,9};
偏移一个地址:
int *p = (int *)( &arr[0]+1);
整体偏移:
int *p = (int *)( &arr + 1);
printf("%d %d\n", *(arr+1), *( p ) );
4、陷阱(进制间转换)
unsigned long *p2;
p2 = ( unsigned long *)0x709000;
printf(" p2 +5 = %p , p2 = %p\n", p2 +5, p2 );
答案: 0x709028, 0x709000
5、 写出 float x 与 “零值” 比较的if语句
const float EPSINON = 0.00001;
if ( (x >= -EPSINON) && (x <= EPSINON) ) //EPSINON 是允许的误差,只要在这个范围内就说明 x 与 0 是相等的
6、switch 语句 的类型不能是 float型
7、cost 用法:
-》const :常量内容不可变 : const int a = 2;
-》常量指针 :int const *a ,内容不可变
-》指针常量:int * const a ,a指向的地址不可变
-》混搭:int * const *a,a指向的内容和地址都不可变
-》底层const:
-》指针:指针指向的对象是常量
-》任意对象:内容是常量
-》顶层const:
-》指针:指针本身就是常量
-》任意对象,值是常量
延伸:
-》const 与 constexpr(c+11新增标准):
1)相同点:大部分场景使用一样,定义普通常量
2)不同点:
-》constexpr 表达式的值 在编译时 就能确定,const 在运行时 确定
-》指针方面:
const: const int *p = nullptr; // p 为指向常量的 指针
constexpr:constexpr int *q = nullptr; // q 为 常量指针
3)constexpr作用:因在编译时就确定值,极大提高程序的调用效率
8、sizeof计算空间大小
易错点:
-》数组名:当函数参数时 被认为是指针,所以空间大小为4
void Fun( char str[100] )
{
sizeof( str) = ? // 易写为100,正确为4
}
9、算法题:
-》字符串:
比较两个字符串是否相等:
const *src,const *dst;
int ret = 0;
while( !( ret = *( unsigned char*)src - *( unsigned char * )dst ) && *dst )
{ ++src }
10、用宏定义得到一个字的高位和低位字节
#define byte char
#define word short
#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))
short a = 256;
printf("WORD_HI: %d WORD_LO: %d\n",WORD_HI(a),WORD_LO(a)); //a = 256 1_0000_0000
11、函数缺省类型,默认是 int 整型。

浙公网安备 33010602011771号