如果有你认为重要的知识点,而我这却没有记录下来的,那么期待你分享给我(^U^)ノ~YO。
1.在结构体中,符号->的前面是指针变量,符号.的前面是普通变量. 程序中a->b等价于(*a).b。
2.枚举enum中第一个元素默认值为0,后面元素依次加一.若是中间元素有赋值的,那其后元素根据前值继续依次加一。
3.main()一般接受两个参数argc和argv,int main(int argc,char** argv)
argc(argument count) 是指命令行输入参数的个数,argv(argument vector)存储所有的命令行参数。
Linux中,若程序名为123,在命令行输入./123 A B C,
那么argv[0]=="./123", ——当前文件的路径
argv[1]=="A",
argv[2]=="B",
argv[3]=="C"。
4.##和#
#是将参数字符串化。
##是把两个参数连接在一起。
1 #define paster(n) printf("token"#n"=%d\n", token##n) //paster(9); 相当于 printf("token 9 = %d\n",token9);
其中#n被字符串"9"替换,一对双引号会被忽略,两个字符串等效于连接在一起的字符串, 比如 "abc" "def" 等效于 "abcdef"。
5._line_ 、_date_
6.运算符优先级
优先级最高者其实并不是整整意义上的运算符,包括:数组下标、函数调用操作符各结构成员选择操作符。他们都是自左向右结合。
单目运算符的优先级仅次于上述运算符,优先级比单目运算符要低的,接下来就是双目运算符。在双目运算符中,算数运算符的优先级最高,移位运算符次之,关系运算符再次之,接着是逻辑运算符,赋值运算符,最后是三目运算符。
重要的两点:
1.任何一个逻辑运算符的优先级低于任何一个关系运算符。
2.移位运算符的优先级比算数运算符要低,但是比关系运算符要高。
所有的按位运算符优先级要比顺序运算符的优先级高,每个“与”运算符要比相应的“或”运算符优先级高,而按位异或运算符的优先级介于按位与运算符和按位或运算符之间。
7.数组名是常量,不可以做自增或其他修改其值的操作,但可以与整数进行运算。
例:int b,a[5]={1,2,3,4,5};
b = *(a++); //False
b = *(a+1); //True
8.宏定义只是做简单的文字替换,不会对要替换的内容做计算或任何改动。
例:#define N 3
#define Y(n) ((N+1)*n)
int s = 2*(N+Y(5+1)); //s的值为2*(3+(3+1)*5+1)=48
9.printf()输出格式
10.extern关键字
存储类型extern只对数据声明有意义。对于函数声明,他可以作为一种格式上的提示,实际中可有可无。(《你必须知道的495个C语言问题》-1.11)
11.复杂的声明
类似于char *(*(a[])())(),看着让人头晕。www.cdecl.org的cdecl程序可以用于解释复杂的声明,可以在英文描述和C语言源码之间互相翻译。
11.void关键字
如果函数的参数可以是任意类型的指针,那么应声明其参数为void *
典型的如内存操作函数memcpy和memset的函数原型分别为:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
未完待续...