C语言部分学习知识记录

发布时间 2023-10-18 09:29:21作者: 时间完全不够用啊

导包#include时候使用<>和""的 区别:

//<filename.h> ->去系统存放头文件的位置找.h文件

//"filename.h”->去当前目录寻找头文件,如果没找到再去系统存放头文件的位置找.h文件

main函数中参数意义

//int argc->从命令行传入的参数个数

//char* argv[]->存放参数的数组

//char* env[]->存放环境变量的数组

预编译到可执行文件

  1. gcc -E 1.c -o 1.i
  2. gcc -S 1.c -o 1.s
  3. gcc -C 1.c -o 1.o
  4. 链接 --> collect2.exe

环境变量

  1. 相同级别下越在前面的目录,执行优先级越高
  2. 不同级别下,系统级优先级更高

引用外部环境变量

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

  1. 从0开始计算
  2. 类型宽度为偏移量
  3. 偏移量为分子
  4. 对齐参数为分母
  5. 整除后进行填值
  6. 非整除则后移一位继续计算

例如:struct结构体中成员属性有

struct name{
  int age;
  char tag;
  int score;
  char sex;
}

分析(对齐参数为 4 ):

  1. int 对应4位
  2. char对应1位
  3. 从0开始计算
  4. 第0位可以存放第一个int 类型的age,占三位
  5. 第4位可以存放第二个char类型的tag,占 1 位
  6. 因为第三个score是int类型,占四位,而第5/6/7位无法整除4(对齐参数与类型占位取最小),所以空出
  7. 所以score从第8位填入到第11位
  8. 最后的char类型的sex从第12位开始到第15位,因为对齐参数为4,每一个都需要占4位