1.算法的特点:
有穷性,确定性,有零个或多个输入,有一个或多个输出,有效性(如:b=0,a/b不能有效执行)
2.++i 先加再使用; i++ 先使用再加;加号在前面就先加 表达式不能使用自加自减运算符
3.多字节数据赋给少字节数据时发生截断,即:将低字节原封不动地送到被赋值的变量
4.max=a>b? a: b 条件运算符的优先级比赋值运算符高,比关系运算符和算术运算符的优先级都低
5.else总是与它上面的最近的未配对的if配对
6.
switch(表达式)
{
case 常量1:语句1(break;)
case 常量2:语句2(break;)
......
default : 语句(break;)
}
7.
while(表达式)
{
语句
}
do
{
语句
}while(表达式);
8.整个逗号表达式的值为最右边的表达式的值
9.break的作用是流程跳到循环体之外,break只能用于循环语句和switch之中,而不能单独使用
continue语句的作用提前结束本次循环,转到循环体结束点之前
10.数组在C语言中是一种数据结构,在Java中是一种数据类型;
Java:A a = new A();
为A类创建了一个实例,但在内存中开辟了两块空间:一块空间在堆区,存放new A()这个对象;另一块空间在堆栈,也就是栈,存放a,a的值为new A()这个对象的内存地址。因为Java在JVM中运行,所以a描述的内存地址不一定是这个对象的真实内存的地址。
11.变量的作用域和生存期
全局变量(外部变量)存储在静态存储区,可用static和extern修饰,被static修饰的全局变量被限于只能在本文件使用,不能被其他文件引用使用。 未被static修饰的全局变量,可在其他文件中用extern声明引用。 在本文件中,也可用extern用扩展全局变量的作用域。
局部变量(函数中定义的变量)可用auto,static,register修饰,缺省情况下被auto修饰,被auto修饰的局部变量在函数被调用时动态分配存储空间(分配到栈),函数结束时释放存储空间;
被static修饰的局部变量在其所在函数第一次被调用时分配存储空间,未指定初始值的分配到BSS段(.bss段),已指定初值的分配到数据段(.data段),函数结束时存储空间不释放,程序结束时才释放存储空间;
被register修饰的局部变量分配空间时分配到CPU的寄存器中。
函数根据能否被外部文件引用分为内部函数和外部函数,被static修饰的为内部函数,被extern修饰的为外部函数,缺省情况下为外部函数,外部函数可在其他文件中用extern声明引用。
12. C语言中实参变量和形参变量之间的数据传递方式是单向的“值传递”方式。用指针作实参时同样遵守这一原则。不可能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。
形参数组可不指定数组大小,紧跟一对方括号,因为编译时形参数组名被处理为一个指针变量。
13. *p++ : 由于++和*同优先级,结合方向自右而左,因此它等价于*(p++)。先引用p的值,实现*p的运算,然后再使p自增1。
++(*p) : 表示p指向的元素的值自加1,而指针p的值不变。
int *i, j;这样定义i为指向整形的指针变量,j为整形变量
14.二维数组即一维数组的数组,多维数组依次类推; a为二维数组名,a和*a的值相同,都为a[0][0]元素的地址。
15. char *b = "House"; 可以引用其中的元素如:b[2],但不能改变其值,因为它为字符串常量;字符数组可以在初始化时统一赋值,但不能用赋值语句统一赋值,字符数组名是指针常量,其值不可改变;字符串结束标志为'\0',字符数组单个赋值时没有结束标志,字符串才有,回车键为字符'\n',输入字符串时回车键往往也被一起输入。
16. 用typedef声明一个新类型名即:按定义变量的方式,把变量名换成新类型名,并且在最前面加typedef,就声明了新类型名代表了原来的类型。
17. 定义指向函数的指针变量的一般形式为:
类型名 (* 指针变量名)(函数参数列表); 由于优先级的关系“* 指针变量名”要用圆括号括起来。 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数;用函数指针变量调用函数时,只须用“* 指针变量名”代替函数名即可。
指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数,这样就能在被调用的函数中使用实参函数,改变不同的实参即可调用不同的函数,这是符合结构化程序设计方法原则的。
18. 通过声明定义的方式分配给变量的存储区在栈区,通过malloc,calloc等函数随时分配随时释放的存储区在堆区
void为空类型,void *指向一个空类型或者说不确定类型,它紧提供一个纯地址,而不能指向任何具体的对象。 p = &a;(编译系统自己进行类型转换) 不能通过*p输出a的值。
#define NULL 0 NULL为符号常量,代表整数0;int *p = NULL;p指向地址为0的单元,系统保证该单元不做它用(不存放有效数据)。p的值为NULL与p未赋值不同,p未赋值也就是p可能指向一个事先未指定的单元,因为它的值此时不可预料,这种情况是很危险的。
19. 用sizeof运算符测量结构变量的长度时,一定是计算机系统字长的倍数,一般为4的倍数;
共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量的成员赋值后,原有变量存储单元中的值就被取代;
“%-6d”表示以十进制整数形式输出,占6列,数据向左对齐;
定义结构体变量关键字struct, 联合体关键字union, 枚举类型关键字enum, 声明枚举类型的一般形式为:enum [枚举名] {枚举元素列表};
枚举元素为枚举常量,只能对它们初始化,不能对它们赋值,可在初始化时直接指定枚举元素的值,未直接指定值的元素以前面最近一个直接指定值的元素为基值递加;引用枚举元素时可直接引用,不必使用.符号。
20. #ifdef, #ifndef, #define的用法
#ifdef _TEST_H /*如果定义了宏_TEST_H执行程序段1,否则执行程序段2*/
程序段1
#else
程序段2
#endif
#ifndef _TEST_H /*如果没有定义宏_TEST_H执行程序段1,否则执行程序段2*/
程序段1
#else
程序段2
#endif
#if 常量 /*如果常量为真执行程序段1,否则执行程序段2*/
程序段1
#else
程序段2
#endif
定义头文件时使用#ifndef和#define可以避免一个文件里重复包含同一个头文件,如:
#ifndef _TEST_H
#define _TEST_H
程序段
#endif
使用#define进行宏定义时结尾没有分号,应使用括号避免边界性问题,应注意参数展开后语句的重复执行,如:MIN(a++, b)。
21.
int const a;
const int b; /*定义一个常整形数*/
const int *p1; /*定义一个指向常整形数的指针*/
int * const p2; /*定义一个指向整形数的常指针*/
const int * const p3; /*定义一个指向常整形数的常指针*/
22. 使用volatile的大致场合:
1.存储器映射的硬件寄存器通常要加volatile,因为每次对它的读写都可能有不同的意义。
2. 中断程序里修改的供其它程序检测的变量。
3. 多任务环境下几个任务共享的变量。
23. 对一个整形变量或寄存器的特定位置位或清零,其它位不变的位操作:
static int a;
对a的x和y位置位和清零,其它位不变:
#define BITx (0x1<
#define BITy (0x1<
a |= (BITx | BITy); //置位
a &= ~(BITx | BITy); //清零
24. 访问特定的内存位置:
int *p;
p = (int *)0x12345678;
*p = 7;
又如 #define GPACON (*(volatile unsigned long * const)0x56000010)
const表示地址不可变,volatile表示所在地址的内容可能被意想不到的改变
25. 满足下列条件之一的多为不可重入函数:
1.使用了静态数据结构或全局数据结构
2.调用了malloc或free函数
3.调用了标准I/O函数,标准I/O库很多实现都以不可重入方式使用了全局数据结构
4.函数中进行了浮点运算
26. 用关键字__interrupt声明的中断服务子程序不能有形参,不能有返回值。
27.
unsigned int a = 6;
int b = -20;
if((a+b) > 6){
printf("%d\n",(a+b));
}
if判断句条件成立,因为有符号数和无符号数相加,相减或相乘时,如果进行比较运算并且值为负时它们的值将是一个非常大的数,但它们的输出值依然为正常值。
(a/b)为0,(b/a)为一个非常大的数,当a为一个非常大的数的时候(b/a)等于1;
28. new
29. 不要把二进制数和机器数,机器数的真值搞混。
//以正负一为例加以说明
二进制数: +0001 -0001
机器数: 0001 1001
机器数的真值: +0001 -0001