1、perror()
原型:void perror(const char *s); 根据errno呈现错误信息
perror("malloc error");
malloc error: Cannot allocate memory
2、多文件编译
.c ---预处理(.i -E)---汇编(.s -S)---二进制(.o )---链接(可执行文件)
3、结构体对齐
1)32位操作系统,最大4个字节对齐。64位操作系统,最大8个字节对齐;
2)#pragma pack(n),强制对齐,比如4、8;
4、位域
1)赋值时不能超过该类型的承受范围;
unsigned char a:2; // 那么a只能存 0 1 2 3 这几个数字
a = 5 ; //错误
int a:2; //a的取值范围是0、1、-2(10,最高位1表示负数)、-1(11,最高位1表示负数)
2)位域宽度为0的位域称为空域,其作用是:该次对齐空间剩余部分全部补0;
struct xx{
int b:1 ;
int :0 ; // 32位对齐,b用了1位,所以该处共有31个0
int c:3 ; // 新的对齐行
}
5、申请结构体变量的空间
typedef struct{
int x;
int y;
int z;
char c;
short d;
} uu_t;
uu_t *p = (uu_t *)malloc(sizeof(uu_t));
6、条件编译
#if defined(宏) || defined(宏)
代码
#endif
#define N(a,b) a+10+b
N(1,2)*10; // 1+10+2*10,错误
最标准的写法:
#define N(a,b) ((a)+10+(b))
1、数组一旦被定义好,就不能改变大小,数组名字也不能赋值;
int arr[10]; arr = 就是错的
2、指针数组、数组指针;
char *a[2] //指针数组,表示有a[2]个指针;
char (*a)[2] //数组指针,表示第一维是指针;
3、scanf("%s")遇到空白符停止的特点;
4、字符串操作函数;
1)strcmp(s1, s2),返回s1 - s2的值(或者固定-1、0、1的值);
5、如何快速查看函数;
1)n + shift + k,3 + shift + k,去C库函数查找;
6、内存管理;
1)如下图所示,是虚拟内存的空间分布;
2)栈,先进后出,地址由高到低分配;
3)内存映射的概念如图所示;
4)输入字符指令
char arr[10] = {0};
printf("%c\n", getchar());
gets(arr);
5)重新实现strcat()函数
void fun_strcat(char arr[], char brr[])
{
int i = 0, j = 0;
while(arr[i] != '\0')
i++;
while(brr[j] != '\0')
{
arr[i++] = brr[j++];
}
arr[i] = '\0';
}
6)memset()函数,设置值只取1个字节;
int main(void)
{
long long ll = 0x1122334455667788;
memset(&ll, 0xaabbccdd, 6); //只取0xdd值
printf("%#llx\n", ll);
return 0;
}
1、函数指针
1)函数的名字就是函数的首地址,就是函数指针;
double fun(int a, short b)
{
return 0.0;
}
sizeof(fun); //注意: 对函数名字 sizeof 没有意义
sizeof(fun(10,20)); //注意:这里面没有做函数调用,该函数没有执行,本质 sizeof(返回值类型)
2)函数指针的使用;
xx_fun(double (*p)(int, short))
{
p(10,20);
}