《C与指针》笔记(二)

【C语言】指针与一维数组笔记(二)! 目录二、指针能指向数组?为啥?1.指针与一维数组(1)指针变量处理数组(2)数组的地址(3)通过一维数组名所代表的地址存取数组元素(4)通过指针运算符“ * ”存取数组元素(5)通过带下标的指针存取数组元素(6)等价规则2.移动指针及两指针相减运算(面向数组)(1)移动指针(2)两指针相减运算(面向数组)3.指针比较4.指向字符串的指针(1)字符指针(2)字符指针与字符数组的区别①使用字符指针处理字符串②使用字符数组处理字符串(3)删除一个字符串中所有的空格字符 二、指针能指向数组?为啥? 1.指针与一维数 阅读详情

在ANSI(美国国家标准协会)C的任何一种实现中,存在两种环境:

1. 翻译环境(Translation environment):负责将源代码转换成可执行的机器指令。

2. 执行环境(Execution environment):用于实际执行。

这两种环境可以不在同一个机器上。

 

预处理, 展开头文件/宏替换/去掉注释/条件编译                      (test.i main .i)
编译,    检查语法,生成汇编                                                      ( test.s  main .s)
汇编,   汇编代码转换机器码                                                         (test.o main.o)
链接     链接到一起生成可执行程序                                              a.out


 

翻译

翻译阶段有几个步骤组成,组成一个程序的每个(可能很多)源文件通过编译器过程分别转换成目标代码(object code),然后各个文件由链接器(Linker)捆绑在一起,形成单一而完整的程序,链接器同时会引入标准C函数库中的任何被该程序所用到的函数,而且它也可以搜索程序员个人的程序库,将其中需要使用的函数也链接到程序中,如图2.1所示。

编译过程也有几个阶段组成:

(1)首先是预处理(preprocessor),由预处理器在源代码上执行一些文本操作,用实际值代替#define定义的符号和#include指令包含的文件的内容;

(2)解析(Parse):源代码经过解析,判断他句子的意思。本阶段是产生绝大多数错误和警告信息的地方(也就是编译期错误),

(3)编译产生目标代码。目标代码是机器指令的初步形式,用于实现程序的语句。若我们在编译程序的命令行中加入要进行优化的选项,优化器(Optimizer)就会对目标代码进行处理,使他效率更高。优化过程需要额外的时间,所以在程序调试完毕并准备生成正式产品之前一般不进行这个过程。至于目标代码是直接产生的,还是先以汇编语言语旬的形式存在,然后再 经过一个独立的阶段编译成 目标文件,对我们来说并不重要。

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。(在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。)

两者比较:对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。

编译和链接

用于编译和链接C程序的 特定命令在不同的系统中各不相同。在绝大多数Unix系统中,C编译器称为cc,可使用多种不同方法来调用:
1. 编译并链接一个完全包含于一个源文件的 C 程序:
cc  program.c
这条命令产生一个称为 a.out 的可执行程序。中间会产生一个名为 program.o 的目标文件,但它 在链接过程完成后会被删除。
2 . 编译并链接几个 C 源文件:
cc main.c sort.c lookup.c
当编译的源文件超过一个时,目标文件便不会被删除。这就允许你对程序进行修改后,只对那 些进行过改动的源文件进行重新编译,如下 条命令所示。
3 . 编译一个 C 源文件,并把它和现存的目标文件链接在一起:
cc main.a lookup.a sort.c
4 .  编译单个 C 源文件,并产生一个 目标文件 (本例中为 program.o ),以后再进行链接:
cc  -c program.c
5 .   编译几个 C 源文件,并为每个文件产生一个 目标文件:
cc   -c main.c sort.c lookup.c

6. 链接几个目标文件:

cc   main.o sort.o lookup.o

用于 MS-DOS 和 Windows 的Borland CIC++  5.0 有两种用户界面,你可以分别选用。Windows
集成开发环境是一个完整的独立编程工具,它包括源代码编辑器、调试器和编译器。它的具体使用 不在本书的范围之内。MS-DOS   命令行界面则与 UNIX 编译器差不太多,只是有下面几点不同:
1. 它的名字是 bcc。
2 .  目标文件的名字是 file.obj 。
3 .   当单个源文件被编译并链接时,编译器并不删除目标文件。
4 .  在缺省情况下,可执行文件以命令行中第一个源或目标文件名命名,不过你可以使用 “-ename” 选项把可执行程序文件命名为 “name.exe”。
 

编译详细过程可参考:

一个C语言程序的编译过程,

c语言编译过程详解,预处理,编译,汇编,链接(干货满满),

C/C++程序编译过程详解

一:预处理 
使用-E选项:gcc -o test.i -E test.c 
预处理阶段主要做了处理“#”的过程:有头文件展开,宏替换,条件编译,去掉注释等。

二:编译 
使用-S选项:gcc -o test.s -S test.c 
编译阶段将高级语言翻译成机器语言,生成对应的汇编代码。

三:汇编 
使用-c选项:gcc -o test.o -c test.c 
汇编阶段主要将源文件翻译成二进制文件。

四:链接 
链接过程主要将翻译成的二进制文件与需要用到的库链接。
 


执行

程序的执行过程也需要经历几个阶段。首先,程序必须载入到内存中。在宿主环境中 ( 也就是 具有操作系统的环境),这个任务由操作系统完成。那些不是存储在堆战中的尚未初始化的变量将在 
这个时候得到初始值。在独立环境中,程序的载入必须由于工安排 ,也可能是通过把可执行代码置 入只读内存(ROM)来完成。
然后,程序的执行便开始。在宿主环境中,通常一个小型的启动程序与程序链接在一起。它负
责处理一系列 日常事务,如收集命名行参数以便使程序能够访 问它们。接着,便调用 main  函数。 现在,便开始执行程序代码。在绝大多数机器里,程序将使用一个运行时堆桔(staek),它用于 
存储函数的局部变量和返回地址。程序同时也可以使用静态(statie)内存,存储于静态 内存中的变量
在程序的整个执行过程中将一直保留它们的值。 程序执行的最后一个阶段就是程序的终止,它可以由多种不 同的原因引起。“正常” 终止就是
main 函数返回。有些执行环境允许程序返回一个代码,提示程序为什么停止执行。在宿主环境中, 启动程序将再次取得控制权,并可能执行各种不同的日常任务,如关闭那些程序可能使用过但并未 
显式关闭的任何文件。除此之外,程序也可能是由于用户按下 break 键或者电话连接的挂起而终止, 另外也可能是由于在执行过程中出现错误而自行中断。
 

 

参考文献:

[1] https://blog.youkuaiyun.com/han8040laixin/article/details/81559727

[2] https://blog.youkuaiyun.com/weixin_41143631/article/details/81221777 

[3] https://blog.youkuaiyun.com/u012662731/article/details/78520349

使用JAVA代码转word文档之动态生成数据填充(图文详解) 今天跟公司对接了业务,根据业务需求,乙方需求文档是word格式的,而我们的数据是动态数据,每生成一份数据,就要以word的形式给乙方一份邮件!这就给了我们的工作一定的难度和挑战! 通过阅读资料,团队的帮助以及自我测试,终于实现了这个功能!因为在搜索资料方面,发现各位博主讲的比较模糊,自己碰到了很多bug,浪费了很多宝贵的时间,所以今天写了这篇文章,希望对自己以后或者他人有所帮助! 操作第一步:先准... 阅读详情

相关推荐

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

本文详细介绍了如何使用R语言的pls包进行偏最小二乘(PLS)回归分析,特别针对高维数据回归问题。通过完整的代码示例和数据标准化避坑指南,帮助读者掌握从数据预处理到模型优化的全流程,解决实际应用中的常见问题。

weixin_42662605的博客 352

C与指针笔记(二)

C语言中最简单的语句是,只包含一个分号,在要求出现一条完整语句但不需要执行任何任务的情况下出现。C语言不存在专门的赋值语句,赋值是在也是表达式语句,只不过没有进行赋值操作而已,表达式被求值但没有任何地方保存它们,第一条语句没有任何效果,第二条语句则是读取输入中的下一个字符,然后将其丢弃。没有任何效果的语句还有printf和i++;等操作,它们只是表达式的值被忽略,但还存在副作用。

qq_40913549的博客 1482

Verilog简易电梯控制系统(2层)

电梯处于1楼,按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY2,LED2亮,电梯继续运行至2楼,LED3灭;按KEY3,LED3亮,电梯处于上行状态时,立刻按 KEY0,LED0亮,电梯继续运行至2楼,LED3灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY3,LED3亮,电梯继续运行至1楼,LED2灭;电梯处于2楼,按KEY2,LED2亮,电梯处于下行状态时,立刻按 KEY1,LED1亮,电梯继续运行至1楼,LED2灭;电梯运行至2楼后LED1灭,2楼待机。

m0_54240221的博客 6958

杂论C语言指针笔记(二)

杂论C语言指针笔记(二)指针与数组(略谈)注意以下两个声明的区别extern int *x;extern int y[];前者声明的x是整形指针,后者声明的y是尚未确定。函数指针“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。函数指针有两个用途:调用函

积累与分享 720

IAR编译相同工程生产hex文件checksum不一致问题

IAR Checksum

xqw19891201的博客 1384

[QMT和ptrade量化交易小白入门]-109、小市值选股的基础上用六脉神剑评分,回测年化可到132%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1871

C语言学习笔记——指针(二)

本文在C语言学习笔记——指针(一)的前提下,就某些关于指针的问题,进行进一步的讨论。 一、不同表达式下,指针的偏移量 不同表达式下,指针的偏移量是不一样的! 请看下面示例。 例1: 不同表达式下,指针的偏移量 测试代码如下: #include<stdio.h> void main(int argc, char const *argv[]) { //定义一个in...

不吃鱼的猫的博客 903

基于YOLOv8与UI界面的短视频内容审核系统实现与深度学习应用

YOLO(You Only Look Once)是一种用于实时物体检测的深度学习模型,它能在单次前向传播中同时完成物体检测和定位。YOLOv8是YOLO系列中的最新版本,相较于之前的版本,YOLOv8具有更高的检测精度和更快的推理速度,特别适合需要实时检测的应用场景。YOLOv8通过卷积神经网络(CNN)来提取图像中的特征,并通过多个卷积层来预测每个目标的位置和类别。该模型的优势在于其端到端的结构,使得在视频监控、自动驾驶、安防监控等实时应用中,能够实现快速且高效的目标检测。

YOLO 314

c指针学习笔记(二)

十、字符串和指针 字符串:字符串是以‘\0’ 结尾的若干字符的集合 字符串存储形式:数组、字符串指针、堆 char string[100] = "i love c!"; 定义一个字符数组string用来存放多个字符 char *str = "i love c!"; 定义一个指针变量str,只能存放字符地址编号,这个字符串的字符不能存放在str指针变量中。 str只是存放了字符1的地址编号, "i love c!"存放在文字常量区 char *str = (char *)malloc(10

噗噗bug博客 661

告别标注地狱!YOLO+CLIP多模态零样本检测全实战:图文联合推理,想检测什么直接输文字,不用训模型

这套方案我给朋友的超市用了快3个月,运行极其稳定,临期商品的检测准确率能到96%,后续加了“货架空货检测”“通道杂物堆积检测”,都是改一行文本就搞定,完全不用重新开发,朋友说省了十几万的定制开发费用。很多做计算机视觉的朋友,总觉得目标检测必须标数据、训模型,其实不是的。现在多模态大模型的能力已经足够强,把YOLO的定位能力和CLIP的图文泛化能力结合起来,就能用极低的成本,搞定绝大多数定制化检测需求。对于我们开发者来说,技术的价值从来不是炫技,而是用最简单的方案,解决最实际的问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 516

XXL-Job 分布式定时任务

XXL-JOB是一款轻量级分布式定时任务调度框架,采用调度中心与执行器分离架构,解决单机任务宕机、重复执行等问题。核心模块包括调度中心(管理任务配置、触发调度)和执行器(执行任务逻辑),支持集群部署保证高可用。框架提供丰富的任务触发规则、路由策略、阻塞策略及完善的运维能力,适用于多种业务场景如数据同步、定时推送等。安装时需准备MySQL数据库并初始化表结构,通过Docker部署调度中心服务。相比其他定时框架,XXL-JOB具有轻量化、可视化等优势,是中小企业的首选方案。

郭宝的博客 703

深入理解C指针 笔记二

指针和函数 程序栈 是支持函数执行的内存区域,通常和堆共享,在这块内存区域的下部是程序栈,上部是堆。 程序栈存放栈帧,栈帧存放函数参数和局部变量,堆管理动态内存 返回指针: 使用malloc在函数内部分配内存并返回其地址,调用者负责释放返回的内存 传递一个对象给函数并让函数修改它,这样分配和释放对象的内存都是调用者负责 传递指针的指针: 将指针传递给函数时,传递的是...

fhaitao900310的博客 291

C#实现将DataGridView中数据导出到Excel (附完整源码)

C#实现将DataGridView中数据导出到Excel (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1589

c语言指针学习笔记(二)

6.指针和多维数组 就拿数组int array[5][2]举例 array 是一个占用两个int大小对象的地址 array[0] 是一个占用一个int大小对象的地址 故此,可以理解给array+1和array[0]+1不同之处 毕竟,一个代表着两个int单位,一个则代表着一个 array是地址的地址,必须解引用两次才能获得原始值 int (* pz)[2] //pz指向一个(内含...

王高狮的博客 343

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C语言进阶学习笔记】二、指针进阶

目录1、字符指针2、指针数组3、数组指针4、数组传参和指针传参5、函数指针6、函数指针数组7、指向函数指针数组的指针8、回调函数 指针可以理解为一个变量,里面存放着地址,可以通过解引用来访问该地址上存储的数据。 指针是有类型的,指针的类型决定着一个指针在+1或者-1时跳过多少个字节;和指针解引用时能访问的内存的大小。 1、字符指针 字符指针中存储着一个地址,该地址的内存块上存储着一个字符;字符指针用char*表示。 一般例如: int main(){ char ch = 'x'; cha

qq_42961603的博客 255

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言指针进阶视频笔记②

鹏哥C语言指针进阶视频中的笔记

yoyoyoyoy6的博客 154

深入理解C指针学习笔记(二)

1.1指针和内存1.11为什么要精通指针指针的几种用途: 写出高效快速的代码(指针接近硬件,可以更好的操控内存); 支持动态内存分配(使用malloc/free等函数对内存进行分配和释放); 是表达式变得紧凑和简洁 提供用指针传递数据结构的能力不会带来庞大的开销(只传递地址而不传递实际数据) 保护作为参数传递给函数的数据 容易实现多种数据结构(如链表等) 1.12声明指针通过在数据类型后面跟星号,再

langzi989的专栏 3767

《C和指针》读书笔记(二)

第五章 操作符和表达式   1.在左移位中,值最左边的几位被丢弃,右边多出来的几个空位用0补齐。   右移位操作存在一个左移位操作不曾面临的问题:从左边移入新位时,可以选择两种方案。一种是逻辑移位,左边移入的用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样就能保持正负形式不变。 2..A&&B,如果A为假,则不执行

h296597152的博客 437

C语言笔记之指针(二)

本文主要介绍指针与内存和地址的关系,指针与内存关系深入解析,包括占用大小、动态分配,提醒使用sizeof()注意点。仅供大家参考学习,若有错换之处,欢迎交流指导~

qq_61637982的博客 253

【C语言进阶学习笔记】二、指针的进阶(3)(练习篇)

本篇文章的内容为指针进阶的相关练习题目,主要是进行指针的练习和巩固,继续上一篇指针相关的内容。【C语言进阶学习笔记】二、指针的进阶(2)(重点必看+代码演示+练习) 文章目录一、指针和数组经典笔试题解析:1、请写出下面程序执行的结果2、请写出下面程序执行的结果3、请写出下面程序执行的结果4、请写出下面程序执行的结果5、请写出下面程序执行的结果6、请写出下面程序执行的结果7、请写出下面程序执行的结果8、请写出下面程序执行的结果二、指针笔试题:笔试题1:笔试题2:笔试题3:笔试题4:笔试题5:笔试题6:笔试题

大家好我叫张同学 2001

C语言指针学习笔记二

出处:http://blog.youkuaiyun.com/kqygww/article/details/21330109 一、什么是指针? 指针是用来存放变量地址的。通过指针可以间接操纵变量。 二、指针的定义 变量类型 *变量名; 如:int *p;定义了一个int类型的指针p。 注意:任何类型的指针都占据8个字节的存储空间 三、指针的初始化 1、先定义,后初始化

自由的天空 462

C和指针——读书笔记(二)

最近频繁地用到数组,又看了《C和指针》数组这一章,所以决定写一些东西,分享一下。   提到数组,很多人都会提到指针。在C语言中,数组名是一个指针常量(意味着你不能修改此常量的值)。为什么呢?我们想一下,数组名,是数组首元素的地址,也就是内存中数组的起始位置。如果修改这个指针常量,唯一可行的就是把整个数组移动到内存中的其他位置。但是在程序完成连接后,内存中数组的位置已经固定了,所以再移动就为时已晚了

Candy链上笔记 799

C语言进阶笔记(二) | 指针详解(上)

目录 字符指针 指针数组 数组指针 数组指针的定义 &数组名VS数组名 数组指针的使用 数组参数、指针参数 一维数组传参 二维数组传参 一级指针传参 二级指针传参 通过前面的学习,我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。 3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。 4. 指针的运算。 这里,我们将继续学...

KYG__U_O的博客 1247

C语言深入理解指针笔记(二)

我们将数组首元素的地址用指针变量封装,在遍历数组时就可以通过使用指针访问数组的元素,arr/p[i]等价于*(arr/p+i),数组元素的访问在编译器处理时,也是转换成首元素的(地址+偏移量)求出元素的地址,然后解引用来访问.parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型的一维数组,parr[i][j]就是整型一维数组中的元素,达到了模拟二维数组的目的。此时的数组名表示整个数组,sizeof(arr)计算的是整个数组的大小。

2401_87277188的博客 492

c语言学习笔记之指针(二)

关于读《深入理解c指针》的读书笔记,欢迎指正。 关于null概念 NULL被赋值给指针意味着指针不指向任何东西。 null概念是指指针包含了一个特殊的值,和别的指针不一样,他没有指向任何内存区域。两个null指针总是相等的。每一种指针类型都可以有对应的null指针类型。null概念是通过null指针常量来支持的一种抽象。 NULL宏时强制类型转换为void指针的整数常量0,许多库中定义为: #define NULL ((void *(0) ASCII字符NUL定义为全0的字节 ...

m0_46234896的博客 288

c语言程序设计现代方法简略笔记————指针(二)

循环会逐步令p等于a[0],a[1]........直到a[10]然后发现条件不满足,循环终止。

2401_89151693的博客 672
上一篇: 《C与指针》笔记
下一篇: C语言三字母字符
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值