- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深层探索C和C__总结
一、调用函数以及压栈:
(1)、每个int占4个字节。
(2)、通常栈是王内存低地址方向增长的,也就是说,先压栈的内容存放在高地址区域,后压的存放在低地址区域。
(3)、一般调用函数时,汇编中call(通常调用函数都是用call指令实现跳转)指令会在主函数体内进行自动压栈。将调用函数后面的语句的地址压栈存。
(4)、一般调用函数前会将传入参数都压栈保存。
二、变量的可见范围和生存期:
(1)、函数内部的非静态变量都会放到栈里面去。
(2)、函数间不能互相访问各自的内部变量(即使是静态的都不行,那是基于语义的要求),基于堆栈的声明和释放。
(3)、外部变量一般存放在数据段(data segment)中,而不是栈中。
(4)、外部变量的定义如果在某函数的函数声明之前,则可以直接使用,如果在某函数名之后,则要用extern进行声明(注意,不是定义,但是造型蛮像定义的)。然后还是要在外面再重新定义的。
(5)、不是所有的外部变量都是任何函数都能使用的,如果在某函数内声明的时候使用了static静态修饰,则不能了。
三、变量的声明和定义:
(1)、声明变量不会使编译器为其分配存贮空间。声明的关键字是extern,有extern的时候,编译器只是知道这个符号是什么意思,此外什么都不做。但是若同时又对其初始化,则会为其分配空间。
(2)、1、在C中,我们常见的类似int a;之类的都是对a的暂时定义(有初始化才叫正式定义,C中,外部变量只能被定义一次,注意是正式定义一次,暂时定义就没有限制了)。2、C++中没有暂时定义和正式定义之分,所有都是正式的。要注意。所以最好要么声明,要么定义,而且都只定义一次。3、C中的暂时变量可以定义多次,当在连接时系统全局空间没有相同名字的变量定义,暂时就升级为正式定义。系统就会为其分配存储空间。
四、编译(complie)和链接(link):
(1)、一般来说程序的编译和链接是整个工作的2个部分,首先是编译,然后链接。
(2)、编译有:预处理程序(包括包含入头文件等)?编译器将代码文件编译成汇编代码文件?汇编编译器将汇编代码文件编译成目标代码文件。
(3)、链接就是将编译得到的汇编代码中每个???录下的需要确定地址的符号(包括变量,子函数等)的地址计算并确定后传入。
五、外部变量的链接性质:
(1)、问题:如何使一个变量像外部变量那样存放在数据段,又不会被其他文件的代码影响到,因为不同文件的同名的外部变量会有冲突。
(2)、当对外部变量进行定义的时候(从这个时候开始,我应该注意区别定义、暂时定义和声明的不同),加static就会将该变量的链接性质从external变为internal,在汇编中就会相应不产生“.globl xx”此句,该变量就只能在本文件中被使用。
(3)、对于暂时定义同理也是加static,但是其会在汇编中加上“.local a”一句,效果是一样的。
(4)、同一个变量的定义和暂时定义间或者几个暂时定义之间,在使用static问题上前后不一致会导致报错。降低程序的可移植性。
(5)、暂时定义与声明不一致则以暂时定义为准,但编译器会发出警告。
六、静态内部变量:
(1)、有static修饰的内部变量可以使内部变量具有外部变量的存储性质,又具有内部变量的可见范围
(2)、静态内部变量汇编时会被编译器加后缀,用以区别不同函数内部定义的同名变量。而汇编时不加“.globl xx”使不同文件不会冲突。
(3)、静态内部变量只会被初始化一次。汇编时“.long xx”对其初始化存放到目标代码文件和后面的可执行文件中。不仅静态变量、所有存放在.data数据段的数据都是这样初始化的。
(4)、”int f(); void g(){int a=f();}”可行,但是”int f(); static void g(){int a=f();}”就不行。因为:初始化静态变量的值必须是编译期就能够求出的常数。
七、函数的声明和定义:
(1)、对函数的调用的步骤:参数的压栈?地址转移?通过压栈或者寄存器返回值。
(2)、函数在调用前若不声明则为KR C风格,而声明的话可以是在主函数的内部(即内部函数声明,该声明只在此主函数内部有效,出去又无效了)也可以在主函数前面外部声明(即外部声明,即我们常见的)。
(3)、我们所接触的函数的声明和定义的风格一共有2种:KR C和C90。
(4)、KR C的特点:1、不对函数的参数进行类型检查(由于程序的多文件性);2、未声明函数仍可以直接调用。3、基本数据类型只有:char、int(2者为整数类)、float、double(2者为浮点数类)。4、对于传入参数,如果是整数类,一律扩展成int传入。5、对于传入参数,如果是浮点类,一律扩展为double传入。6、凡是没有指明类型(包括返
您可能关注的文档
- 浅析:汽车制造业PLM需要着重关注三个方面.doc
- 齿轮传动-答案.doc
- 浮动静态路由测试.doc
- 八年级英语下册第二单元复习.ppt
- 樱花时尚E座回填土施工方案.doc
- 怎样使用TPC-C进行服务器的评估.doc
- 编辑部-稿酬制度.doc
- 药物分析模拟卷 一 .doc
- 陕西省2013届数学.doc
- 2010年下半年网络管理员下午试卷标准答案.doc
- 部编版一年级语文下册第四单元《8 夜色》教学课件(2025年春-新编教材).pptx
- 江苏省盐城市五校2024-2025学年高一下学期4月期中联考数学试卷(含答案).pdf
- 2025年高一语文教师工作总结简单版(六).docx
- 第12课《台阶》课件 2024—2025学年统编版语文七年级下册(共39张PPT).pptx
- 部编版一年级语文下册第四单元《语文园地四》教学课件(2025年春-新编教材).pptx
- 部编版一年级语文下册第四单元《9 端午粽》教学课件(2025年春-新编教材).pptx
- 指导技能的关键要素与提升的策略研究与分享.docx
- 湖南省永州四中直升班2025届高三(下)适应性数学试卷(含答案).pdf
- 湖北省荆荆宜襄·四地七校联盟2024-2025学年高一(下)期中联考数学试卷(含答案).pdf
- 2025年04月17日袁荣的初中历史组卷.docx
文档评论(0)