1.sizeof()
1.求变量开辟空间的大小 sizeof(a) 2.求类型声明的变量开辟的空间大小 sizeof(int) 3.求常量需要的空间大小sizeof(65)
2. a强制转换的是a中值的类型 a本身类型不会改变
3.当不同类型的数据进行运算的时候会发生隐式转换
不同数据类型进行运算是时:
四个看齐 1.整型要向浮点型看齐
2.float 向double 看齐
3.短字节向长字节看齐
4.有符号向无符号看齐
4.c程序的执行过程:
1. 首先cpu把二进制的执行程序拷贝到内存的代码段
2.然后cpu就会按照这个二进制的程序从main函数开始执行
3.调用main函数会压一个main栈(变量a的空间就在main栈中),然后把2放到a的空间中 。
4.接着遇到了调用func函数,这个时候会压一个(push)func栈 执行里面的代码 ,遇到return func栈会出栈(pop,然后把func空间释放(交给系统内存),出栈也就是func函数调用结束,
5.然后执行func函数调用地方下面的代码;最后main函数中遇到了return,那么main栈出栈(会释放,main函数结束,整个程序结束)
5.局部变量与全局变量
作用域 内存的位置 什么时候释放
局部变量: 包含它的{}中 函数栈中 函数调用结束 /函数栈释放
全局变量: 整个工程所有文件 数据段 程序结束数据段才会释放
静态局部变量 作用域 : 从声明开始到包含它的{}结束;
内存: 在数据段 (注意 :不是在栈中 不会随栈消失而消失;) 在编译时执行(只执行一次)。
静态全局变量 作用域: 只能在当前文件(包含该变量的文件)内使用(如 main.m)
内存:在数据段
6.野指针;
1.指向一个非法空间(比如系统占用的空间)2、不知道指向哪里3.free(p) free之后的指针指向的空间不能再使用
7.&a(a是数组名)表示的意思
int main(void)
{
//|XXXX|XXXX|XXXX|XXXX|XXXX|
int a[5] = {3,10,28,9,5};
int * p = (int *)(&a+1);
p--;
printf("*p = %d\n",*p);
return 0;
}</span>
输出的结果应该是 *p=5,
因为&a 是数组的地址,它的类型 int(*)[5] ,&a+1 , +1 加了整个数组的大小,相当于1* sizeof(int [5]),所以&a+1 让指针指向了a[5]后面,p-- 后,p自然就指向a[5]了。
8.字符串相关函数
1.atoi();把字符串转化为int类型
2.strlen();统计字符串有效长度不统计尾零
3.strcmp();字符串比较
4.strcpy
把src所指由NULL结束的字符串复制到dest所指的数组中
5.strcat
把两个字符串拼接在一起,结果放在第一个字符串里
①第二个字符串带'\0'依次拼接到第一个字符串第一次出现的'\0'后面
②第一个参数必须指向一个合法的空间并且能够被修改切足够大空间
6.strstr
//字符串查找:在第一个参数指向的字符串中查找第二个参数指向的字符串 或者说查找子串在长串中的位置(从前向后第一次子串出现的位置)
//返回值:找到子串 返回子串在长串中的位置 找不到返回NULL
9.const关键字
*前 const
const int *p; // 限制*p不能被修改 p可以改
int const *p; //同上
*后const
int *const p; //限制p不能改,*p可以改
两个都有
const int *const p;// p和*p都不能改
10.结构体
struct 结构体名 {
成员变量1;
成员变量2;
成员变量3;
};
自定义了一个结构体类型 struct Stu ;
struct Stu {
char name[30];
int num;
double height;
int score;
}; //这个分号不能省略
结构体就是具有多个不同数据类型的集合,
结构体大小 跟系统位数和编译器有关
type struct _Range{
int location;
int length;
}Range;
//typedef 定义结构体的另外一种形式 给结构体struct _Range 起别名叫Range
11.枚举
enum Sex{
Male,
Female
};
typedef struct Stu {
char name[20];
int num;
int sex;
}Student;
12.宏
预处理
预处理 -------> 编译-------> 汇编--------> 链接---
在预处理阶段 会处理 “#"开头的预处理语句
在于处理阶段 会把宏替换原来宏定义的后面的一串代码
1.无参宏
#indefine 宏名 一串代码
#indefine PI 3.1415926
2.带参数的宏
#define SUM(x,y) x+y
例:ret=SUM(1,2);<——————> ret=1+2;
#define MUL(x,y) x*y;
ret=MUL(1+2,3+3); <----------------->ret=1+2*3+3;
定义带参宏的宏 参数和整体都要加();
宏定义在同一行;
宏会使代码体积增大 函数不会
定义方式不一样
宏不会压栈
宏不检查类型 函数会检查
宏不能调用自己 函数可以
一个反斜杠‘\’, 在宏定义中 表示连接符 可以把多行的内容连接成一行
#if 0
printf("a");
printf("a");
printf("a");
printf("a");
#endif
#if 0
语句块1;
#else
语句块2;
#endif
-------->条件编译 预处理阶段 如果值是非0值 那么执行语句块 否则不执行
#ifndef 宏名
语句块;
#endif
-----------------》 如果没有定义宏 显示语句块