导包#include时候使用<>和""的 区别:
//<filename.h> ->去系统存放头文件的位置找.h文件
//"filename.h”->去当前目录寻找头文件,如果没找到再去系统存放头文件的位置找.h文件
main函数中参数意义
//int argc->从命令行传入的参数个数
//char* argv[]->存放参数的数组
//char* env[]->存放环境变量的数组
预编译到可执行文件
- gcc -E 1.c -o 1.i
- gcc -S 1.c -o 1.s
- gcc -C 1.c -o 1.o
- 链接 --> collect2.exe
环境变量
- 相同级别下越在前面的目录,执行优先级越高
- 不同级别下,系统级优先级更高
引用外部环境变量
extern char ** environ;
常量指针和指针常量
const int * pont = &i; //常量指针 const在左
int const * point = &i; // 常量指针 const在左
int * const point = &i; // 指针常量 const在右
数组访问
int arr[5]={1,2,3,4,5};
第一种:
arr[0]==>1
第二种
*(arr+0)==>1
自定义变量类型
.h文件中不允许定义,只能声明
数组传递时会丢失长度
int fun(int *arr, int len);
int arr[3]={1,2,3};
fun(arr,sizeof(arr)/sizeof(arr[0]));//直接arr会丢失长度,方法内获取长度时arr的长度为1
栈中元素有
局部变量
函数形参 ==》被调函数的局部变量
栈帧的指针信息
==栈中空间由操作系统开辟和释放==
全局变量存放位置
全局变量==》静态区
==bss==是未初始化变量存放空间
==data==是已初始化变量存放空间
静态存储区空间申请后默认为0,和数组初始化为0效果一样,所以数组初始化为0还是放在bss
static变量同样会放在静态区
栈中变量会随栈的结束而结束,而静态区中的变量不会
堆
堆由程序员自己申请和释放,如果不释放,则会随进程结束而释放
内存定义
起始地址+长度
起始地址+结束标识
起始地址+
常量只读区
char *buff = "hello"; // 局部变量在栈
buff = "world"; // 指向改变
// 字符串"hello" "world" 放在常量区(常量区:只读)
// linux系统中通过size命令查看text字段
内存分区
4G内存:
核心:1G
栈
堆
静态区
只读区
C语言的结构体
struct和class区别
struct就是class,但是存在访问权限不同:
struct默认public
class默认private
打印对应的地址
0x12345678 在栈中按照
个位:78
十位:56
百位:34
千位:12
由低到高输出
栈顶
为低位,栈底
为高位
从栈顶输出78 ==》低位对应低位 ==》小端存储
==从千位
入栈存储为小端存储==
==从个位
入栈存储为大端存储==
二进制序列没有大小端概念
#pragma pack(1)
改变对齐参数(默认为4),改为1
- 从0开始计算
- 类型宽度为偏移量
- 偏移量为分子
- 对齐参数为分母
- 整除后进行填值
- 非整除则后移一位继续计算
例如:struct结构体中成员属性有
struct name{
int age;
char tag;
int score;
char sex;
}
分析(对齐参数为 4 ,结构体中每个属性都占4位,不足则空位):
- int 对应4位
- char对应1位
- 从0开始计算
- 第0位可以存放第一个int 类型的age,占三位
- 第4位可以存放第二个char类型的tag,占 1 位
- 因为第三个score是int类型,占四位,而第5/6/7位无法整除4(对齐参数与类型占位取最小),所以空出
- 所以score从第8位填入到第11位
- 最后的char类型的sex从第12位开始到第15位,因为对齐参数为4,每一个都需要占4位