数据存储
文章平均质量分 74
明 日 香
快和我一起快乐学习
展开
-
预编译(3)
许多C的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要个数组能够大些。int i = 0;for(i=0;i原创 2023-10-01 10:24:15 · 113 阅读 · 4 评论 -
预编译(2)
所以在这两个代码的基础上,就产生了#运算符,#运算符和##运算符其实并不是C语言中的运算符,它们两个实际上都是预编译中为了引起预编译时,编译器的注意而产生的运算符,只服务于预编译。关于##运算符的用法,其实最常见的就是在使用#define定义一个调用函数模板的时候。使用#将所需要被预编译代替和发现的字符显示出来,且在这里我们使用了字符串的多段输出。代码和上图进行对比,就会发现,#define定义了一个函数,利用了宏的特性。在这里呢,我们设置了一个宏,用这个宏来进行一个类似于函数调用的模板。原创 2023-09-30 14:54:52 · 112 阅读 · 2 评论 -
预编译(1)
define 机制包括了⼀个规定,允许把参数替换到⽂本中,这种实现通常称为宏(macro)或定义宏 (define macro)。原创 2023-09-29 16:18:01 · 188 阅读 · 2 评论 -
文件的编译与链接
在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。代码通过翻译环境进行编译,变成一个可执行的程序,可执行的程序其实就是二进制指令或者叫他机器指令,二进制指令在运行环境中运行和执行。也因此翻译环境分为两个部分,一个是编译另一个是链接。 是源文件通过了编译器内部的预编译、编译、汇编进行了文件的转化,最终变为目标文件,同链接库一起进入了链接器中进行最后的转化。预处理会把头文件的内容添加到文件中代替原来的头文件,且原创 2023-09-29 10:57:05 · 124 阅读 · 0 评论 -
文件的随机读写函数:ftell & rewind
将指针举例起始位置的偏移值交给了pos。返回文件指针相对于起始位置的偏移量(偏移值)。让文件指针的位置回到文件的起始位置。原创 2023-09-27 17:30:49 · 122 阅读 · 4 评论 -
文件的随机读写函数:fseek (fseek与fgetc的联系)
根据文件指针的位置和偏移量来定位文件指针,是一个读取函数。原创 2023-09-27 17:08:21 · 169 阅读 · 2 评论 -
顺序读写函数的介绍:fread & fwrite
在fwrite在文件中放入七个元素的基础上使用fread读取文件中的七个元素,注意如果读取的个数超过了文件中元素的个数,那么剩下的部分会因为二进制放入的原因,变成0进行补充。因为是二进制写入,所以在文件文本是看不到内容的,所以我们使用rb进行读取数据看是否正确,而这时候就要使用fread。原创 2023-09-27 16:23:42 · 117 阅读 · 1 评论 -
顺序读写函数的介绍:fscanf & fprintf
将结构体变量中的成员内容写入屏幕中。写入结构体变量中的成员内容。原创 2023-09-25 22:45:28 · 358 阅读 · 1 评论 -
顺序读写函数的介绍:fputs & fgets
且发生了一个问题,因为函数是读取一行的内容,而文件的效果中有两行,且第一行的内容不足填充数组空间,所以会不会使用第二行进行填充数组空间?原创 2023-09-25 21:26:22 · 217 阅读 · 1 评论 -
顺序读写函数的介绍:fgetc & fputc &文件拷贝
fgetc:一次只读取一个字符fputc:一次写一个字符。原创 2023-09-25 21:00:04 · 312 阅读 · 1 评论 -
文件操作(2)
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。文件信息区存放文件名字状态位置等等,而这些信息就是存放在一个结构体变量中,也就是说这个文件信息区就是一个结构体变量,或者说文件信息区是由一个FILE类型的结构体来描述的。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。当前路径的位置下的上一级路径的上一级路径下的hehe文件下的test.txt文件。.. 表示上一级的路径。原创 2023-09-23 13:55:20 · 103 阅读 · 1 评论 -
总结C/C++中程序内存区域划分
总结C/C++中程序内存区域划分:1. 栈区(stack):2. 堆区(heap):3. 数据段(静态区)(static):4. 代码段:原创 2023-09-22 20:02:50 · 345 阅读 · 0 评论 -
柔性数组
利于访问的原理是:柔性数组开辟是连续的,这种方法不是连续的,不能一次性将结构体内部的成员全部访问,而且这种写法相当于在内存中开辟多个空间,并且频繁进行malloc会导致堆区很多地方剩下的空间像碎片一样,被浪费,空间利用率降低。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返 回给⽤⼾⼀个结构体指针,⽤⼾做⼀次free就可以把所有的内存也给释放掉。第⼀个好处是:⽅便内存释放 如果我们的代码是在⼀个给别⼈⽤的函数中,你在⾥⾯做了⼆次内存分配,并把整个结构体返回给⽤ ⼾。原创 2023-09-22 16:54:47 · 216 阅读 · 1 评论 -
动态内存经典题分析:题出自《高质量c++编程》
而在这里,指针变量str传递的只是数值,并不是地址,若要改变str的值,则只能传递str的地址,因为不是传递地址的形式进行传参,这个参数会自己单独开辟一个空间进行调用函数内部的代码运行。因为字符串在打印的过程中,其实是将字符串的收个字符的地址传递给了printf进行打印,所以当str是一个指针,且这个指针的值是一个字符串,那么这个指针实际指向的是字符串的首字符。在普通变量的传参中,若使用指针则是将变量的地址传递给指针后,这个变量的内容会因为地址的传递,而在调用函数中的改变而发生改变。原创 2023-09-20 21:30:38 · 122 阅读 · 1 评论 -
盘点常见的动态内存的错误
不过编译器在过程中并没有报错。原创 2023-09-20 21:05:46 · 62 阅读 · 0 评论 -
realloc
realloc函数的出现让动态内存管理更加灵活。有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时 候内存,我们⼀定会对内存的⼤⼩做灵活的调整。那realloc 函数就可以做到对动态开辟内存大小的调整。原创 2023-09-20 17:44:45 · 144 阅读 · 1 评论 -
calloc
calloc 函数也⽤来动态内存分配。原创 2023-09-20 16:34:03 · 89 阅读 · 0 评论 -
malloc与free
而就算是变长数组也只是说数组的大小可以使用变量来指定,而一旦数组创建好后,依然是不能调整大小malloc是用来申请内存的free是用来释放内存的。原创 2023-09-19 21:32:48 · 3711 阅读 · 1 评论 -
char的范围是一个循环的圆
2、char类型实际上分为signed char 和 unsigned char ,再一些编译器中(例如VS)signed char 其实等价于char ,下文的char 我们将默认为signed char。根据说明,我们得知char的范围是0~255,从结果进行判断,我们可以得知再char中 255+1=0。3、char 的范围是 0~255 unsigned char 的范围是 -128~127。所以,我们可以得出结论,char的范围是一个循环的圆。以上代码再VS编译器中进行运行,得到的结果是0。原创 2023-09-16 14:14:20 · 117 阅读 · 0 评论 -
数据在内存中的存储(2)
那么使用科学计数法则是 1.011*2^2 和十进制一样,将小数点往前移动两位,但因为是二进制,由于满二进1的原则,所以这里乘的是2的二次方,这和10的2次方是一个道理。例如:123.45可以写为1.2345*10^2 将小数点朝前移动两位,并乘上10的2次方,使得整数只剩下一位。如上文所诉,我们可以得知了5.5的二进制运算法则,那么5.5这个浮点型数字的二进制这么表达呢?在科学计数法的基础上增加了一个符号位,也就是(-1)^ s。所以写法如下:(-1)^ 0 * 1.011 * 2 ^ 2。原创 2023-09-14 21:06:28 · 163 阅读 · 2 评论 -
数据在内存中的存储——练习5
而且因为没有符号位,所以进制位可以肆无忌惮的+1,且在每次+1后进行了截断,而截断后的结果都不会超过。unsigned char的范围,也就是'255'原创 2023-09-13 15:10:36 · 62 阅读 · 0 评论 -
数据在内存中的存储——练习4
求出在遇见字符'0'之前的字符个数。\0在ASCII中的数值是0。原创 2023-09-13 14:49:31 · 82 阅读 · 0 评论 -
数据在内存中的存储——练习3
截断后因为需要打印成%u也就是打印成无符号整形,所以进行整形提升,因为截断后符号位是1,又因为是char类型,属于是有符号类型,所以看符号位进行补充,所以补1。以%u形式打印无符号进行打印,因为是无符号,所以没有原反补的概念,所以直接打印这一串得出结果。上图是3.1的答案,在分析3.1之前我们首先要明白一个东西, char的取值范围。以上是-128的原码、反码、补码,因为是char类型我们需要进行从右到左的截断。%u是无符号格式进行打印,或者说打印无符号整数。有符号的char类型的范围是-128到127。原创 2023-09-13 14:11:30 · 365 阅读 · 0 评论 -
数据在内存中的存储——练习2
char a=-1 与 signed char b =-1。且无符号的数字在整形提升时全部补0,所以用0来补充到32位。但是c是无符号类型,而%d打印的是有符号类型的。PS: 截断是指从右到左截断八个比特位。上图是-1的原码反码和补码。但因为打印的是有符号整数。原创 2023-09-13 13:48:55 · 68 阅读 · 0 评论 -
数据在内存中的存储——练习1
且a是地址,被转化后,地址变成了一个int的类型的地址。而在强制转化后的+1就是地址物理数据上面的+1。就相当于是加了一个字节的地址。原创 2023-09-13 13:31:02 · 55 阅读 · 0 评论