1. gcc编译过程:预处理(-E、.i)/宏展开、条件编译、删除注视--- 编译(-S、.s) /生成汇编文件--- 汇编(-c、.o)/生成二进制文件 --- 链接 ()/与相关的库文件链接;
2. 数据类型:常量、变量(char 1 short 2 long/float/int 4 double 8 long double 12、布尔类型 bool(srdbool.h)关键字是ture和 false、void)、强制类型转换 (数据类型)表达式;其实char a;也是强制转换,低精度转高的是隐式类转换,高向低的是强制类型转换;
3. 字符串:‘x’与“x”不一样,“x”多了一个\0、sizeof()是i计算空间内存,strlen()是计算字符长度,遇\0结束,所以不包括\0、%(h/l/ll)d,%o,%x,%c,%s(除空格以外的字符都是可以接受的)所以可用while((str=getchar())!=’\n’)来读取空格,%f,%p,%%(打印%本身);
int %d、short %hd、long %lld 、float %f 、double %lf 、long double %Lf
4. 表达式与语句的区别就是表达式+;就是语句;
5. while(入口条件循环)/do…while;(退出条件循环):while(experrssion) statement(可以花括号的复合语句),dostatement while(expression);二者的区别在于dowhile循环多一次;
6. for(initialize;test;update)initialize只执行一次,test表达式求值,计算update表达式;
7. if(expression) statement_a else statement (else与最近的if配对)还有一种是梯形if
if(expression_a)
statement_a ;
else if(expression_b)
tatement_b ;
else;
tatement_x;
8. switch:
switch(expression(为整型,浮点型的不行))
{
Case constant1(整型常量):
…..break;(看情况加,构成多重标签)
Default:
……break;
};
9. break与continue的区别在于,continue只与循环结构匹配,break跟switch和循环体匹配,continue是结束本次循环,break是直接跳出当层循环,而return 是直接跳出函数;
10. 函数:声明(放在头文件附近)和定义(是有函数体的)、形参是声明是的参数,不占用空间,实参是调用时传入的参数、函数传参有赋值和地址传递两种;
11. 数组:是连续的储存空间,储存的类型一样,不检查越界、int date【10】={….}(right)定义完后date【10】={…}(error)这时的下标代表的是数组下标的数,如不初始化一定要【N】、数组名为数组的第一个元素的地址、对于多维数组,int date【】【3】若不初始化,则列一定要标数字、不够全部补零,一维数组的数组名是该数组的第一个元素的地址,&数组名是整个数组的地址,对于二维数组a+1是第一行的首地址,a[0]+1是a[0][1]的地址,所以a[i]+j是第i行j列的地址 a+i 是第i行的首地址,a+i取值(*(a+i))后是a[i];
12. 指针:const型的,constint*P 修饰int,int*constP 修饰指针、
int *p[10]指针数组(循环取首地址,输出为*p[0,1..]),int(*p)[10]数组指针(取首地址,(*p)[1,2…]),int(*p)(int)函数指针(直接取函数,函数名就是一个地址),
int *p(int)指针函数,int(*p[10])(int)由函数指针组成的数组
其实对于指针,只要是指针,
Int a inta[10] nt *p1 int function(int a)
Int *p int(*p)[10] int *(*p) int (*p) (int a)
P=&a; p=&a p=&p1 p=&function
对于指针只是修饰的则 int *
13. 储存类,链接,内存管理
作用域 :C代码段作用域(一般),函数原型作用域(int a(int i)文件作用域 (全 局)
链接;外部(可在多文件程序的任何地方),内部(一个文件的任何地方(static)),空(只能自己私有)
存储时期:静态(程序运行一直存在),自动 (系统分配)
a.自动 autoint 存在stk中
b.寄存器 registarint
b.空链接的静态 代码段之内 static
d,具有外部链接的静态 所有函数之外,全局
e.具有内部链接的静态 所有函数之外,static 存在数据段
f.malloc分配的空间存在堆里
int *p=NULL;
P=(int *)malloc (sizeof(int)*n);
*P=..;
不能p++;
Free(p);
14. 复杂声明,typedef是一种彻底的封装,声明之后不能在往里面添加东西、常用于简洁的指向其他东西的指针,typedef现有的数据类型 自定、eg:typedef void(*sighandlert_t)(int) sighandler_t signal(int sig,sighandler_t);
15. 结构体
#include<stdio.h>
#include<string.h>
struct Student//结构体定义
{
float score;
char name[12];
};//在没有实例化对象时不占用空间,设计数据完后与基本数据类型一样
typedef struct Student Student;//结构体别名定义
/*
typedef struct Student//结构体定义
{
float score;
char name[12];
}Student;//另外一种结构体别名定义(常用)
struct Student//结构体定义
{
float score;
char name[12];
}zhangsan,lisi;//另外一种结构体变量定义(常用)
struct
{
float score;
char name[12];
}zhangsan
//省略结构体名(一般用于函数或结构体内部)
*/
int main()
{
Studentzhangsan={100,"zhangsan"};//={.name=zhangsan,.score=100}
//zhangsan={100,"zhangsan"}(error)
Student lisi;
lisi.score = 70;
strcpy(lisi.name,"lisi");//定义变量并且初始化
/*Student zwh;
printf("input name:");
scanf("%s",zwh.name);
printf("please input score:");
scanf("%f",&zwh.score);
printf("%s\n",zwh.name);
printf("%.1f\n",zwh.score);
return 0;
Student *p = &zhangsan;//结构体指针
printf("%.1f %s\n",zhangsan.score,p->name);//取数用点,指针用-》*
return 0;*/
/*指针定义分配大小
Student *student = NULL;
student =(Student*)malloc(sizeof(Student));
if(student == NULL)
{
perrer("malloc:");
return -1;
}
student->score = 100;
strcpy(student->name,"zwh")
free(student);
*/
//结构体大小计算
struct strsize
{
char a;//4 m=4
int num[20];//4*20 m=4
char *p;//4 m=1
M=4;
//2对齐,4对齐,剩下可以进就进,不进就前面的不要了,重新分配,因为32CPU一次只能读写4个字节;
}s1;
printf("%d\n",sizeof(s1));//结构体内存算法如上
return 0;
} 共用体与结构体类似,空间不一样(成员互斥是使用)
16.枚举:enum 标签{}c c只能去{}里的数,如果{}里的数不赋值,则按0123..排列下来//主要是把{}里的数给标识;
17.宏定义:
#define PI 3.14
/#define MAX(x,y)({ \
typeof(x) _x=x;\
typeof(y) _y=y;\
(void)(&_x (> == <)&_y);\\判断2个x和y的类型
(_x)>(_y)?(_x):(_y);\
})
宏知识代替,所以要避免自加的情况(x++),因为代替的时候,自加了2次;
18条件编译
#include<stdio.h>
int main()
{
#if 0
#ifdef DEBUG//有定义宏出hello或者在编译时加-DDEBUG
printf("hello\n");
#endif
#ifndefDEBUG//没有定义宏出hello或者在编译时加-DDEBUG
printf("nhello\n");
#endif
#if A-19 //表达式真出来 用于注释
printf("nnn\n")
#endif
#endif
return 0;
}