感谢下面的参考文章中博主的辛苦撰写
1.零值包括哪些
参考:https://www.cnblogs.com/PikapBai/p/14415303.html
0,0.0,FALSE,NULL "空指针",空白符,空字符串等
float x 与零值比较时不能直接使用==或!=,float 类型的零值一般为 1e-6
const float E = 1e-6;
if ((f >= E) && f <= E)
指针类型的零值为 NULL(空指针)
int *p_i = NULL;
if (p_i == NULL) 或者 if(p_i != NULL)
char 类型的零值为空白符:'','\t','\n','\v'(垂直制表符),'\f'(换页符),'\r'(回车符)
字符串 零值 表达:
char str[9] = {0};
char p_str = str;
if (strlen(str) ) 或者 if(strlen(p_str) == 0)
2.指针的长度
参考:手把手入门C语言—指针的长度_c语言指针长度_林伟茂的博客-CSDN博客
int* iPoint;
char* cPoint;
print("iPoint 的长度 %d")
所有指针的长度是4个字节,能够传递任何类型的地址
还需要指出的是:指针位数和编译器位数相同
参考:指针变量占几个字节 为什么指针变量占4个字节-巨铭百科网
指针就是地址,地址就是指针,而地址就是内存单元的编号,一个指针占几个字节,等于是一个地址的内存单元编号有多长。CPU通过地址总线在内存中找到数字3的地址,通过控制总线知道该操作是读还是写,然后通过数据总线,把数字3传输到CPU中。CPU地址总线的宽度决定了CPU的寻址能力,数据总线的宽度决定了CPU单次数据传输的传送量,也就是数据传输速度,控制总线决定了CPU对其他控件的控制能力以及控制方式。
指针几个字节跟语言无关,而是跟系统的寻址能力有关。
使用指针来读取数据,再重复操作的情况下,可以明显改善程序性能,例如遍历字符串。
数据存储是以“字节”为单位,数据传输大多是以"比特为单位",每8位组成一个字节Byte,是最小一级别的信息单位。计算机能处理的最小单元是字节 而不是位。
位:是由软件通过位运算符操作的
指针和指针变量的区别
指针变量就是存放地址的变量,指针变量通常也叫作指针,其实含义不同。
3.基础编译时需要了解的一些知识
hello.c 预处理 hello.i 编译S hello.s 汇编 c hello.o 链接 hello
参考:centos编译c_centos编译c文件_云月绝的博客-CSDN博客
gcc:编程语言编译器,支持包括Java,c++,c,Fortran
toolchain:编译工具链是指GCC为核心的一整套工具,主要包含以下内容
1.gcc-core:完成预处理和编译,把c代码转化为汇编代码
2.Binutils:除gcc之外的一系列小工具,由gcc间接调用
包括:
链接器: ld ,将编译之后多个目标文件组织成最终的可执行程序
汇编器:as,汇编代码转换成机器码
目标格式查看器:readelf 查看目标文件或可执行程序文件的信息
目标文件符号查看器:nm,查看目标文件中出现的符号(出现的哪些符号?)
目标文件格式转换器:objcopy,如bin转.elf,.elf转换成bin
.elf文件 :参考:ELF文件格式的详解_.elf_pingxiaozhao的博客-CSDN博客
.bin文件:bin(二进制文件)_百度百科
反汇编:objdump, 查看目标文件信息
查看目标文件尺寸:size ,不同部分的尺寸和总尺寸,例如代码段大小,数据段大小,使用的静态内存,总大小等
3.glibc:包含了主要的C语言标准函数库,如printf,mallo函数等
静态链接和动态链接:
静态链接:在生成可执行文件的时候(链接阶段),把所有需要函数的二进制代码都包含到可执行文件中。如果静态库有更新,所有的可执行文件都得重新链接才能用上新的静态库。
动态链接:在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库执行代码,最终达到运行时链接的目的。
由于运行时加载可能影响程序的前期执行性能。