![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
a_QI_YUE_KU_RONG
这个作者很懒,什么都没留下…
展开
-
数组和指针的区别和联系?
1:数组名代表一个静态地址,它指向数组元素的首地址,不可随意更改。 而指针变量指向一个变量或一块内存的地址单元。可以改变指向。2:在使用sizeof()中,sizeof(数组名)代表整个数组的所有字节的和,而sizeof(指针)的长度是由地址总线长度确定。3:数组在内存分配时是一连串的空间分配,而指针只是分配其指针大小,用到时,改变指向。4:当把数组当成函数参数传递时,这时,数组原创 2017-10-20 23:41:49 · 462 阅读 · 0 评论 -
static和extern不可缘木求鱼
在C语言里面static和extern对我们来说,是最熟悉的“陌生人”,对于这两个关键字,我们不能病急乱投医,不能缘木求鱼。必须从根本上认识他们。1:static如果在一个函数体里面的话,那么他就只定义一次,这我在“对全局变量的一点认识”里面已经说过了,就不再累赘了,在来说说他的第二层含义,就是如果在一个函数里面定义了static关键字,那么他的生存期就不再受函数的控制了,也就是说,stati原创 2017-11-08 21:02:20 · 406 阅读 · 0 评论 -
内存栈的分配和堆的分配 。printf函数的认识
我们拿一个简单的程序来看一看。在底层汇编之下函数的调用和内存的关系。#includeint add(int a,int b){ int c=0; c=a+b; return c;}void main(){ int a=10; int b=20; int z=0; z=add(a,b); printf("%d",z) 3:原创 2017-11-21 11:45:00 · 548 阅读 · 0 评论 -
数组的“面具”
在谈到数组时, 我们总是将他们与指针混在一起。下面,我将谈谈数组的一些伪装。1:数组名总共在四个地方表现的不同。 一:在 sizeof(数组名)这个时候数组名代表的是整个数组的长度,即也就是总元素乘以每个元素占的空间大小。 二:在引用的状态下,int (&br)[10]=数组名,这是数组名也是代表了整个长度。 三:在数组名当形参的时候,他就退化成了一个指针。四:在其他的情原创 2017-11-02 14:34:36 · 284 阅读 · 0 评论 -
关于静态全局变量的一些想法
静态全局变量在初始化的时候只初始化一次,接着它就不在初始化了,这是怎么实现的那,我们通过反汇编代码来看看。#includeint fun(int a1){ static int a=a1; static int b=10; a++; return a;}void main(){ int a1,a; for(a1=10;a1>0;a1--) {原创 2017-11-06 18:53:45 · 264 阅读 · 0 评论 -
C编译时各个阶段都在做什么
C语言编译主要分为四个阶段1.预处理 此阶段主要完成#符号后面的各项内容到源文件的替换,往往一些莫名其妙的错误都是出现在头文件中的,要在工程中注意积累一些错误知识。 (1)、#ifdef等内容,完成条件编译内容的替换 (2)、#include中内容,在当前目录或者指定目录,或者默认目录搜索头文件,并将头文件拷贝到源文件中。 (3)、#define的内容,替换de转载 2017-10-24 11:09:40 · 1138 阅读 · 0 评论 -
#define和typedef的比较以及#define与函数的不同
#define和typedef的比较1:typedef是声明新的类型名,使用新的类型名代替原有的类型名, 而且typedef是在编译的时候有用,所以会进行类型的检测。 而#define是在预编译的时候进行简单的宏替换,所以不会进行检测。2:对待指针时的不同 例如: #define int* Pi;Pi a,b;的意思是定义了一个指向整形的指针和第一了一原创 2017-11-02 15:08:36 · 280 阅读 · 0 评论 -
可见性和生存期的比较
1:可见性一般体现在编译过程,而生存期表现在执行过程。 如下: #includevoid main(){ int x,y=10,dv=100; for(y=x;y>0;y=y-b*dv,dv=dv/10) { int b=y/dv; printf("%d",b); }}会出现的错误,这是因为在原创 2017-10-21 15:35:28 · 382 阅读 · 0 评论 -
循环的“妙用”
1:goto语句是无条件跳转语句,其用法是。goto语句后是标签(遵从标识符规定),直接跳跃至标签处,而且标签后面必须有冒号;2:break语句一般用于循环,switch之中,用于跳出循环,如果有多层循环的话,结束的只是最里面的循环。3:return语句一般是用于一个函数结束的时候,如果是主函数4:continue的跳转 A: 在for循环之中,一般continue是跳转在for的原创 2017-10-16 19:04:52 · 360 阅读 · 0 评论 -
sizeof PK strlen
区别1:sizeof是关键字,其后可跟变量,跟类型时一定要加括号.strlen是函数,相当于一个计数器,其参数是char *s.区别2:char a[]={shuipingzuo} sizeof(a) // a代表的是整个数组的长度固值应该为12(后面有一个/0的结束符) strlen(a)//其值为有效长度为11.原创 2017-10-11 23:05:27 · 242 阅读 · 0 评论 -
函数参数的不同和“夸张”的引用
函数的形参的可能性有,变量,指针,数组和引用。先来看变量。int fun(int a,int b) 例如此函数形参是两个变量,它们的存储地址和主调函数里的实参是不同的,所以{ 改变了形参的大小,并不会改变实参的大小。但为什么分配的内存不同,还可以把返回值带回? int c; 这是因原创 2017-10-29 12:49:36 · 390 阅读 · 0 评论 -
EAX、ECX、EDX、EBX寄存器的作用
一般寄存器:AX、BX、CX、DXAX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器索引暂存器:SI、DISI:来源索引暂存器,DI:目的索引暂存器堆叠、基底暂存器:SP、BPSP:堆叠指标暂存器,BP:基底指标暂存器EAX、ECX、EDX、EBX:為ax,bx,cx,dx的延伸,各為32位元ESI、EDI、ESP、EBP:為si,di,转载 2017-10-20 23:44:43 · 729 阅读 · 1 评论 -
inline函数和普通函数以及static与#define之间的“恩怨前仇”
在c++里面引入了inline函数,首先它和#define的区别:A:1:#define是在预编译的时候,进行的没有类型检查的单纯替换,而inline是在编译的时候进行的有类型检查的代码展开。2:#define没有调试的可能,如果你的代码里面有#define所替换的函数,那你只能祈祷不要出错。而inline在debug版本下是有调试的代码的,在release版本下没有调试的信息。B:!inline...原创 2018-04-01 19:17:23 · 387 阅读 · 0 评论