
c语言学习分享
c语言
多吃维C~
这个作者很懒,什么都没留下…
展开
-
整型提升、算术转换、强制类型转换
整型提升问题表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器的字节长度,一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU原创 2022-04-26 15:18:12 · 528 阅读 · 0 评论 -
#define使用
#define定义标识符写法:#define 标识符名字 内容标识符名字大小写均可#define后面最好不要用分号;如果用了分号在替换的时候也会替换上分号在预处理阶段,所有使用#define定义的名字都会被替换成对应的内容例如:#define MAX 100#define REG register#define定义宏写法:#define 宏名(参数) 内容把宏名全部大写宏与类型无关,宏的参数可以是类型,宏比函数在程序的规模和速度方面更胜一筹宏的参数如果是表达式,原创 2022-04-09 22:48:32 · 1187 阅读 · 0 评论 -
编译与链接问题
程序编译与链接组成一个程序的每个源文件通过编译过程分别转换成目标代码/目标文件(.obj文件或.o文件).obj文件是windows环境下,.o文件是linux环境下每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中编译本身的几个阶段第一阶段:预编译,也要做预处理第二阶段:编译第三阶段:汇编预编译(预处理)时要做的事:头文件的包.原创 2022-04-08 17:31:35 · 180 阅读 · 0 评论 -
strlen库函数、strcpy库函数、strcat库函数、strcmp库函数
strlen库函数求字符串长度,从给定的地址向后访问字符,统计'\0'之前出现的字符个数,不包含'\0'strlen函数的返回值为size_t,是无符号的整型,返回的是字符串长度转义字符算一个长度如果没有加\0,strlen会形成随机值,因此参数指向的字符串必须要以 '\0' 结束。这个库函数需要引用头文件 string.hstrcpy库函数字符串拷贝函数写法:strcpy(用于存储复制内容的目标字符串,要复制的字符串)strcpy返回的是目标空间的起始地址,也就是目原创 2022-04-05 21:44:13 · 861 阅读 · 0 评论 -
动态内存管理
传统数组的缺点数组长度必须事先制定,且只能是常整数,不能是变量(c99可以是变量)传统形式定义的数组,该数组的内存程序员无法手动释放在一个函数的运行期间,系统为该函数分配的空间会一直存在知道该函数运行完毕时,数组空间才会被系统释放数组的长度一旦定义,其长度就不能再修改了,数组的长度不能在函数运行的过程中动态的扩充或缩小函数在运行期间可以被其他函数使用,但是函数运行完毕后,函数中的数组将无法再被其他函数使用静态内存和动态内存比较静态内存是由系统自动分配,由系统自动释放的动原创 2022-03-29 18:41:49 · 1576 阅读 · 0 评论 -
c的位段问题
位段位段的作用是节省内存空间,因为有的成员不需要那么大的空间,因此可以通过位段来节省空间位段不会进行内存对齐其实位段算是结构体,结构体实现了位段位段的声明类似于结构体,有两个不同位段的成员需要是 int、unsigned int、signed int 、char位段的成员名后边有一个冒号和一个数字(比结构体成员多了冒号和数字),表示这个成员占多少个比特位(bit位)位段的内存分配没有标准规定,一般情况下是,先开辟一块成员数据类型大小的空间,依次存放每个成员,直到这一块空间不够存放原创 2022-03-26 20:16:21 · 308 阅读 · 0 评论 -
结构体内存对齐
为什么要有内存对齐平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。结构体内存对齐规则介绍结构体在内存中存储的时候,会存在一个内存对齐的现象内存对齐规则:结构体的第一个成员存放在与结构体变量偏移量为0的地址处(也就是结构体第一个成员存放在结构体原创 2022-03-25 17:16:20 · 115 阅读 · 0 评论 -
memcpy和memmove功能实现
memcpy的实现:#include <stdio.h>#include <assert.h>void* my_memcpy(void* dest,const void* src, size_t count){ assert(dest && src); void* res = dest; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src原创 2022-03-23 20:34:24 · 118 阅读 · 0 评论 -
野指针概念介绍
什么是野指针野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)野指针成因指针未初始化:局部变量指针未初始化,默认为随机值在这里我们可以访问修改指针变量本身的内存地址,但是不能解引用来访问变量中存储的垃圾值(也就是把垃圾值当作一个内存地址来解引用了),因为解引用垃圾值所代表的内存单元的控制权限并没有分配给此程序指针越界访问:当指针指向的范围超出数组的范围时,就是野指针指针指向的空间释放:当指针中地址已经被销毁\释放的时候,这个指针就成为了野指针规避野指针原创 2022-03-25 17:07:24 · 2908 阅读 · 0 评论 -
指针初阶介绍
指针介绍内存被划分为了若干个内存单元,一个内存单元的大小是一个字节(8bit)每个内存单元都有编号,这个编号被称为内存地址/指针指针就是内存地址,口语中说的指针通常指的是指针变量。指针变量内存地址或指针可以存放在一个变量中,这个变量被称为指针变量指针变量是用来存放内存地址的变量指针变量写法:数据类型* 指针变量名 = &变量名*的意思是表示这个变量是指针数据类型是取地址的变量的类型指针变量的大小是由所存储的地址大小来决定的(其实就是内存地址的位数)原创 2022-03-25 17:03:51 · 599 阅读 · 0 评论 -
检测编译器是大端存储还是小端存储方法
#include <stdio.h>int check_sys(){ int a = 1; if (*(char*)&a) { return 1; } else { return 0; }}int main(){ int check = check_sys(); if (check == 1) { printf("小端\n"); } ...原创 2022-02-25 13:02:40 · 311 阅读 · 0 评论