
一.C语言基础知识1.内存内存划分:基本单位字节Byte 最小单位比特位bit二进制 1B8bit2.系统x86硬件架构~win32软件架构32即32个地址总线2的32次方B即4GBwindows中 用户空间内核空间22Linux中 用户空间内核空间31x64硬件架构3.内存的存储区禁止访问区128MB代码区.text后缀名数据区静态局部变量、静态全局变量、全局变量、字符串常量堆区动态内存自己申请自己释放 win默认大小1.5G~1.9G 开辟由低地址向高地址栈区普通局部变量 开辟由高地址向低地址 大小1MB内核使用区4.计算机组成CPU中央处理器运算器、控制器存储器内存运行程序占用空间断电即消失外存永久性存储输入设备输出设备总线地址总线、数据总线、控制总线5.用户标识符int sum0; sum即标识符规则唯一性不能重定义、不能以数字开头、大小写区分、不能是32个关键字6.常量宏常量#define 没有空间不占字节没有类型替换规则枚举常量本质整型定义enum Color{red,green,blue}; //默认值red0green1,blue2enum Color{red5,green,blue2}; //值red5green5,blue2使用enum Colorred;注enum Color5;(底层相同类型不同不通过。强转)const修饰的常变量C中const侧重变性;C中侧重常性类似宏常量替换7.数据类型有符号整型类型名字节数输入形式short2B%dint4B%dlong int4B(windows)/8B(linux)%ldlong long8B%lld注取值范围2B正负32开头5位4B正负21开头10位浮点型float4B%fdouble8B%lf注单精度浮点型定义float a1.2f;不可丢掉f字符型char1B%c(字符) 或 %d(ASCII码值)定义char val97;//ASCII 十进制数char vala;char val\141;//转义字符 \ooo --一个o表示一个八进制数char val\x61;//转义字符 \xdd --一个d表示一个十六进制数字符取值范围char val0b10011111; //二进制 负值//负数 取反1 --原码1110 0001 -- -97short num0b10011111; //二进制 正值//正数 直接算32-1128//num 即 0b00000000 10011111 符号位 首位值unsigned char val0吧0011111//二进制 正值有符号与无符号区别该类型所占字节首位是否是标记位char取值范围-128~127 2的8次方数据量unsigned char取值范围0~255转义字符\a --响铃符\n --换行符\ --单引号\\ --反斜杠字符\t --水平制表符\v --垂直制表符\ooo --o表示一个八进制数\xdd --d表示一个十六进制数\ --双引号 \C语言\ --%s -- 展示C语言特殊字符ASCII码值A65a97 (空格)32\n(换行)10\00048size_t类型x86无符号整型%ux64无符号long long, %llu8.运算符算术: - * / %(取余) --关系: ...逻辑 ||赋值 - * / 位运算 -- 二进制位 右移符号 val n val/2的n次方左移符号 valn val*2的n次方~ 取反 所有数值位都取反 ~-1 ---- 0 按位与 nm 二进制位 相同位上值有一方是0.该位结果00b10100b1100 --- 0b1000| 按位或 n|m 二进制位 相同位上值有一方是1该位结果10b1010|0b1100 --- 0b1110^ 异或运算符 --- 二进制位 相同位上值相同0不同结果10b1010 ^ 0b1100 ---- 0b110异或特点: 1). 自己异或自己 结果 02). 0^val 结果 val场景: 1).数据成对出现只有一个数落单这个数是多少?int main(){int arr[] {1,3,2,1,2,4,3}; //落单数据int len sizeof(arr)/sizeof(arr[0]);int res 0;for(int i 0;ilen;i)res ^ arr[i];printf(%d,res);return 0;}2).交换函数: void Swap(int *pa,int *pb){ *pa *pa^*pb;*pb *pa^*pb;*pa *pa^*pb; }3).IP地址转换点分十进制示例: unsigned int ip 4144631325;ip二进制1111 0111 0000 1010 0000 1110 0001 1101将其转成点分十进制字符串247.10.14.29int arr[4]; int i 0;while(ip){arr[i] ip 0b11111111 ;ipip8 ; //ip8 }char buff[100];sprintf(buff,%d.%d.%d.%d,arr[3],arr[2],arr[1],arr[0]);//fprintf(stdout,%d.%d.%d.%d,arr[3],arr[2],arr[1],arr[0]);打印到显示屏二.C语言数组1.定义int arr[]{1,2,3};int arr[10]{}; int arr[10]; //10个整型0int arr[10]; //10个随机值2.数组函数封装数组实参(数组首元素地址) 传递 给形参节省内存void Print(int* arr,int len){//下标访问for(int i0;ilen;i){printf(%d,arr[i]);}//指针for(int i0;ilen;i){printf(%d,*arr);}注*arr*和优先级相同 结合方向自由向左结合3.字符数组与字符串char str[]{a,b};//字符数组char str1[]{a,b,\0};//字符数组字符串 char str2[]ab;//字符串 //str1与str2完全等价char str[]124\0abc; int len1sizeof(str)/sizeof(str[0]); //数组容量 len18;int len2strlen(str); //数组有效长度,第一个\0前的字符个数 len23;4.字符串操作函数str系列函数 string.hchar str[]hello; char sub[10]; //10个\0strlen(str) --- 求字符串长度 5 strnlen()strcpy(sub,str); 将str拷贝给sub strncpy(sub,str,2);strcat(sub,str); 将str字符串链接到sub字符串后方 strncat(sub,str,1);strcmp(end,end123)-- int: 0 相等 1 前后 -1 前后 strcmp(3);strtok() 分隔函数 使用char buff[]2025-11-10 21:9:3;printf(%s,strtok(buff,:)); //结果打印出“2025-11-10 21”printf(%s,strtok(NULL,:)); //结果打印出9(字符)原理把遇到的第一个:转化为\0同时返回一个地址p若调用时传空 地址则从p地址开始找冒号注若strtok(buff,10); 则找字符1和0,找到后将值改为\0atoi itoa函数 stdlib.hint atoi(const char* str); 字符串转整型例int res atoi(123) --- 结果整型:123char* itoa(int num,char*buff,int radix); //将num 以radix进制转换 存储到buff字符数组中例char buff[20]; itoa(100,buff,8); printf(%s,buff); -- buff:144(字符串)5.内存操作函数mem系列函数memsetStudent stu; //name age address{province city}memset(stu,0,sizeof(stu); //stu变量从逐字节用0memcpy从前往后拷贝不会检测是否重叠void mymemcpy(void* str, const void* sub, size_t n){assert(str!NULLsub!NULL); //断言char* pstr (char*)str;const char* psub (const char*)sub;while (n 0){ *pstr *psub;n--; }}memmove检测到重叠时会从后往前拷贝void mymemmove(void* str, const void* sub, size_t n){assert(str!NULLsub!NULL);char* pstr (char*)str;const char* psub (const char*)sub;char* p;const char*q;//1. 内存重叠if (psub pstr psub n pstr){ p pstr n - 1;q psub n - 1; }while (n 0) //n计数{ *p-- *q--; n--; }}else { mymemcpy(str,sub,n); }}6.面试点字符串操作atoi,itoa 函数实现memcpymemmove函数字符串专项题大数相加、串匹配算法KMP、BF三.C语言指针1. 基本定义和解引用int val 1; const int num 2;int* p val; *p 10;const int* q num; //q指针 指向之物 具有常性 *q1;errint* s num;//权限缩小错误int* const t val; //限制t变量 具有常性(指针变量t 的指向具有常性) t a;err//const和 二级指针结合const int**s q; // const int**int*const*r t; // int* const *2. 指针运算int * p val;p1 的能力 从p所指地址开始 向高地址偏移 1*sizeof(*p);Type* name;name n ; name地址开始 高地址 偏移 n*sizeof(*name);(char*)((long long*)p1)[-2]//(long long*)p1 保存地址 p偏移量1*sizeof(long long)// (char*)(aim)[-2] -- *((char*)aim-2)3. 指针与数组4. 指针与函数5.面试题6.动态内存四.C语言结构体目的设计一种新类型typedef struct Student { }Student; Student stu {name,10}; //strcpy(stu.name,zs); //strncpy(stu.name,lisi,5); memcpy(stu.name,lisi,5); Student*psstu; (*ps).age1;//ps-age1; Student srr[]{{zs,10},{lisi,12}}; Student *pssrr; ps[1].age1;//将第二个学生的属性修改结构体大小默认内存对齐方式vs 8B ;gcc 4B struct A { int a; //4 char c; //13 double d; //8 float f; //4 }; 总大小4138420B ---是最大基本类型double8B的整数倍 24B //指定对齐方式 #pragma pack(4) struct A { int a; //4 char c; //13---前方偏移量是否是MIN{1,指定对齐方式4} double d; //8 MIN{8,4} float f; //4 MIN{4,4} }; 总大小20B ---是MIN{最大基本类型8B4B}整数倍重点为什么考虑内存对齐CPU效率提高CPU读 字长4B(x86)或8B(x64)如果数据跨越了这些边界CPU可能需要两次访问才能读取一个数据提升CPU读取效率联合体结构体成员内存空间独立联合体内部设计的属性共享一份内存空间struct Student { char name[20]; int age; }; 24B内存 union Test { char arr[2]; short s; }; 2B内存联合体允许多个成员共享一份内存空间五.C语言文件文件分类1.文本文件.txt .c .cpp .java .py2.二进制文件(多媒体文件).mp3 .mv .pptx .png打开模式1.文本文件w(只写) r(只读) a(追加写入)区别w文件不存在会创造文件文件存在则清空原文件r文件不存在则打开失败返回NULL存在则打开文件a文件不存在会创造新文件文件存在则在文件末尾追加写入读写模式w r a2.二进制文件wb rb abwb rb ab文件操作1.fopen,fclose2.字符、字符串读写从文件读取fgetc fgets向文件写入fputc fgets3.格式化读写从文件读取fscanf向文件写入fprintf4.二进制读写从文件读取fread向文件写入fwrite5.文件定位与状态设置光标位置fseek SEEK_SET开头位置SEEK_CUR文件当前位置SEEK_END末尾位置统计文件大小ftell判断文件是否读到末尾feof六.特殊文件名及应用C语言函数网站:cpp preference1.ctype.h判断英文字母isalpha()判断数字字母isdigit()判断小写英文字母islower()判断大写英文字母isupper()用法if(isalpha(a)) //返回值0或1{printf(这是一个英文字母)};2.math.hpow(a,3)即a的3次方3.取整向上取整floor向下取整ceil七.特殊功能1.设置一个随机数#includetime.htime_t ttime(NULL);srand((unsigned int)t);int numrand()%n;//随机一个[0,n)的整型2.设置时间随机数