精华内容
下载资源
问答
  • c 语言学习心得体会一c 语言学习心得体会 c 语言作为一种计算机的语言我们学习它有助于我们更好的了解计算机与计算机进行 流因此c 语言的学习对我们尤其重要 在这个星期里我们专业的学生在专业老师的带领下进行了 c ...
  • C语言学习心得

    千次阅读 2019-03-12 13:38:14
    回想起来,自己接触C语言也有了...本科学习过多种语言,同样也跟随着老师探讨过诸多项目,但是相较于两年前的自己,感觉编程能力并没有什么进步,反而自己在时间的流逝当中,渐渐的迷失。总觉得C语言不过如此,虽然...

    回想起来,自己接触C语言也有了三个年头,作为一个正经大学的科班出身,不能说自己对于C语言的了解太少,但是就目前自己的水平而言,远远没有那种敢于说自信的程度,近期华为软件经营挑战赛的进行,使得自己更加清晰的认清自己与他人所存在的差距。本科学习过多种语言,同样也跟随着老师探讨过诸多项目,但是相较于两年前的自己,感觉编程能力并没有什么进步,反而自己在时间的流逝当中,渐渐的迷失。总觉得C语言不过如此,虽然数组、指针、内存管理等诸多知识点也能够说出个123,但是总感觉自己还是一个在门外打转的边缘人物,在这种想法之下,就想进一步的巩固基础知识,为即将到来的学习生活负责,努力让自己认清C语言的整体脉络,而不仅仅是处于边缘的部分试探。

    自己选择的第一本书是陈正冲老师的《C语言深度剖析》,这本书在整体上感觉并不是太厚,电子版也仅有100+的样子,但是细读起来,感觉老师讲述的并非普通教科书那种基础,而是那种不深入思考完全平时不会遇到的问题,也就是自己原本未曾涉及到的领域。

    在书籍的第一章讲述的是关键字,可能大家一想到关键词,“哦,关键字嘛,不过如此”,也确实没有太多的概念,细数之下,C语言官方定义的关键字有32个之多,虽然有的关键字已经耳熟能详,但是有些关键字并没有太多的接触,诸如union、volatile、extern、sizeof等。

    什么是定义?:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。这个名字一旦和这块内存匹配起来,它们就同生共死,并且这块内存的位置也不能被改变。一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。

    什么是声明?:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到变量或对象是在别的地方定义的,同样声明可以出现多次;也会告诉编译器,这个名字我已经预定了,别的地方不能用它来作为变量名或对象名,但是就声明的这个节点,本身并没有使用这个空间或者对象名。

    所以关于定义以及声明之间的区别就应该看是否通过这条语句实现对变量或者对象分配空间的操作

    Register:使得变量尽可能的定义在CPU的内存中,从而加快CPU存取变量的速度,但是也有可能不再内存中,所以不能使用&符号来取得变量所在的地址,其所定义的变量一定是符合CPU寄存器类型的变量,长度需要小于或者等于一个整形的长度。

    Sizeof:一个经常被认为是函数的关键字,sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子,诸如:int、signed、short等)大小时不能省略。

    Extern:置于函数或者变量的前面,表示变量或者函数在别的文件中已经有了定义。当编译器在遇到extern这个关键字时,提示其去其他的模块寻找定义。

    对于循环嵌套的的情况,如果有可能,应当将最长的循环放在最内层,将最短的循环放在最外层,以减少CPU跨切循环层的次数。

    Main函数的参数问题,一般的情况下,在定义main函数的时候,并不会为其置入参数列表,但是main函数确实是有参数的存在的,其可以定义为以下三种形式:

    1. 函数没有参数,返回值为int类型:int main(void){/*······~~·*/}
    2. 函数有两个参数,类型分别为int以及char**,返回值是int类型:int main(int argc,char *argv[]){/*······~~·*/}
    3. 还有三个参数的:int main(int argc,char * argv[],char *envp[]){/*······~~·*/}

    argc(全称为 argument count)的值为 0 或者为命令行中启动该程序的字符串的数量。程序本身的名称也算作该字符串,也要计算进去。

    argv(全称为 arguments vector)是一个 char 指针数组,每个指针都独立的指向命令行中每个字符串:数组中元素的个数,比 argc 的值多 1;最后一个元素 argv[argc] 是空指针。如果 argc 大于 0,那么第一个字符串,argv[0],就是程序本身的名称。如果运行环境不支持程序名称,那么 argv[0] 为空。如果 argc 大于 1,从字符串 argv[1] 到 argv[argc-1] 包含该程序命令行参数。

    envp(全称为 environment pointer)在非标准的、有 3 个参数的 main()函数版本中,是一个指针数组,每个指针都指向组成程序环境的一个字符串。通常,这个字符串的格式是“名称=值”。在标准 C 语言中,可以利用函数 getenv()获取得这些环境变量。

    Const在修饰变量或者指针的时候,应该先将类型名忽略,然后按照就近原则进行修饰,比如const int *p可以见得const修饰的是*p,为指针指向的对象不可变,若 int * const p此时const修饰的为p,即指针p不可变,但是p指向的对象内容可变,也就是说仅仅绑定了p与所指对象的关系。

    Volatile 随时会发生变化的变量,用的地方很少,就是对编译器说这个变量是随时会发生变化的,在做代码优化时会被跳过对该部分的一种优化,按部就班的从内存中存取变量的值,并不是将中间值进行赋值或者其他操作。

    Union 维护足够的空间来放置多个数据成员中的一个,而并非为结构中所有的成员都分配好内存空间,也就是说在union中所有的数据成员公用同一块空间,在同一时间该地址块只能存放一个元素,并且所有的元素具有相同的初始地址。而空间的大小参照union中数据元素占用空间最大的那个。

    当前系统的存储模式(大端模式/小端模式):所谓的大端模式是指字数据的高字节存储在低地址中,而字数据的低字节存放在高地址中,小端模式反之。这样就牵制到首地址存储的问题,首地址肯定是程序段内存分配的低地址位,而根据系统的存储模式则影响着首地址中的数据分配问题,这个在wenhex中可以对文件的数据信息进行查看,同样也可以利用输出共用体的数据来进行判断。

    Typedef的真正意思是:给一个已经存在的数据类型(而不是变量)取一个别名,而非定义一个新的数据类型—rename。typedef struct student{/*~~~*/}Stu_st,*Stu_pst;上述typedef语句可以认为将struct student 取了一个别名Stu_st,还有一个*Stu_pst。从而可以利用这些别名来分别定义Struct student 类型的变量。

    ++ -- 运算符:对于前自加与后自加的区别,详述如下前自加(++a)先执行自加操作,然后再引用a 的值,对于后自加(a++)操作,先引用a的值,然后执行a的自加操作,当然在自加操作为孤立的一行时,上述两种操作的效果一样。

    预定义与注释编译顺序问题:代码注释行要先于预定义指令被编译器进行处理。

    #error预处理:编译程序时,只要遇到#error 就会生成一个编译错误提示消息,并停止编译。

    #pragma指令:用于设定编译器的状态或者只是编译器完成一些特定的动作。例如:#pragma message(“信息文本”)当编译器遇到这个指令时,就会在编译信息输出窗口输出消息文本,从而给与文本提示。

    内存对齐:字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4 整除的地址,和可以被8 整除的地址。)由于访问未对齐的内存,处理器需要作两次内存访问,然而,对齐的内存仅需要一次访问,则出现了内存对齐的必要性,即牺牲一点空间(成员之间有部分内存空闲),来提高处理器访问的性能。对于未对齐内存为何需要两次内存访问,解释如下:某些对双四字的操作指令需要内存操作数在自然边界上对齐,如果操作数没有对齐,这些指令将会产生一个通用保护异常。双四字的自然边界是能够被16 整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),但是需要额外的内存总线周期来访问内存中未对齐的数据。

    内存对齐的原则:首先,每个成员分别按自己的方式对齐,并能最小化长度。其次,复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。然后,对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。

    指针:int *p;

    通过上述定义声明了内存中的4个字节的空间,然后把这个内存空间将其命名为p,同时限定着4个字节的空间里面只能存储某一个内存地址,即使存入了其他的数据,也都会被编译器当作地址来处理,并且由上述声明的那样,从首地址开始的连续4个字节只能存储某个指向int数据的地址。另外无论对于什么样的数据类型,指针类型始终都是4个字节(32位),因为其存放的是相关数据类型的地址。

     

    简述int *p=NULL与*p=NULL之间的区别:首先第一句为初始化过程,定义一个指针变量p,其指向的内存里面保存的是int类型的数据,在定义变量p的同时把p的值设置为0,而不是把*p(即指针p指向的内存空间)的设置为0;第二句为赋值过程,有可能指针p指向的为非法地址,从而导致在编译器编译之时导致编译错误,然后赋值语句将这个p指向的内存空间的内容赋值为NULL。

    数组:int a[5];

    当我们定义一个数组a 时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a,名字a 一旦与这块内存匹配就不能被改变。也就是说a为整个数组的一个名字,其代表的是数组首个元素的首地址,并且数组不能以整体的形式被访问,仅能访问数组中的某一个元素,而不能将数组当作一个整体进行访问。&a为整个数组的首地址,虽然它的值与a的值相同,但是含义却是有所区别,a为数组首个元素的首地址,&a为争着数组的首地址。

     

    指针

    数组

    保存数据的地址,任何存入指针变量p 的数据都会被当作地址来处理。p 本身的地址由编译器另外存储,存储在哪里,我们并不知道

    保存数据,数组名a 代表的是数组首元素的首地址而不是数组的首地址。&a 才是整个数组的首地址。a 本身的地址由编译器另外存储,存储在哪里,我们并不知道。

    间接访问数据,首先取得指针变量p 的内容,把它作为地址,然后从这个地址提取数据或向这个地址写入数据。指针可以以指针的形式访问*(p+i);也可以以下标的形式访问p[i]。但其本质都是先取p 的内容然后加上i*sizeof(类型)个byte 作为数据的真正地址。

    直接访问数据,数组名a 是整个数组的名字,数组内每个元素并没有名字。只能通过“具名+匿名”的方式来访问其某个元素,不能把数组当一个整体来进行读写操作。数组可以以指针的形式访问*(a+i);也可以以下标的形式访问a[i]。但其本质都是a 所代表的数组首元素的首地址加上i* sizeof(类型)个byte 作为数据的真正地址。

    通常用于动态数据结构。

    通常用于存储固定数目且数据类型相同的元素。

    相关的函数为malloc 和free。

    隐式分配和删除

    通常指向匿名数据(当然也可指向具名数据)

    自身即为数组名

     

    &p[4][2] - &a[4][2]的值为多少?

    代码如下:

    int a[5][5];

    int (*p)[4];

    p = a;

    由上述定义可知,p为一个数组指针,共有四个元素,所以p+1就意味着内存往后往后移动了4*sizeof(int)的空间,也就是说,&p[4][2]的值为&a[0][0]+4*4*sizeof(int)+3*sizeof(int)

    所以原式可以等于4*sizeof(int)

    内存管理

    野指针:未被绑定的指针,也就是说定义指针的时候并没有为该指针绑定内存空间,导致这个指针在内存中没有规则的约束,从而导致某些问题的发生。而解决野指针的最好方法就是在每一次定义指针的时候,都要为其初始化,即使目前并没有指针他的亲身参与的项目,那就把它赋值NULL。

    静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。

    栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。

    堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。

    内存分配

    Malloc函数: (void *)malloc(int size)

    malloc 函数的返回值是一个void 类型的指针,参数为int 类型数据,即申请分配的内存大小,单位是byte。内存分配成功之后,malloc 函数返回这块内存的首地址。需要一个指针来接收这个地址,但由于函数的返回值是void *类型,所以必须强制转换成你所要接收的类型,也就是说,内存将要用来存储什么类型的数据。同样在堆上分配的地址空间并没有赋予名字,也就是说堆上的内存都是以匿名访问的形式进行。在使用malloc函数时应注意函数的返回值是不是一个可用的地址,也就是说要判定堆上的空间是否被分配成功,若失败,函数返回的时NULL。

     

    展开全文
  • 可编辑文档 PAGE 页码页码/NUMPAGES 总页数总页数 c语言学习心得体会一c语言学习心得体会 c语言作为一种计算机的语言我们学习它有助于我们更好的了解计算机与计算机进行交流因此c语言的学习对我们尤其重要....
  • c语言学习心得

    2015-11-21 21:08:57
    最近在进阶c语言的时候的一些小心得,希望能帮到大家
  • C语言学习心得 通过半个学期的学习我由以前的对C语言的懵懂与好奇逐渐转变为熟悉与理性也逐渐发现了其中的博大精深还是在上个学期的时候我就渴望着学习C语言而当我真正学习他的时候却发现它并非我想象中的那么好学我...
  • c语言学习心得体会 1116 字 c语言是在国内外广泛使用的一种计算机语言其语言 功能丰富表达能力强使用灵活方便既具有高级语言的 优点又具有低级语言的许多特点适合编写系统软件其 功能强大不仅用在计算机上广泛用在...
  • 大学c语言学习心得感悟 大学c语言学习心得感悟篇1 林林总总的计算机语言林林总总的计算机技术林林总总的计算机书籍让我们初入计算机的菜鸟一次就吓的没有勇气迷茫和徘徊让我们丧失了时间和信心没有诀窍吗?...
  • C语言学习心得.doc

    2020-06-16 09:16:02
    C语言学习心得 经过学习了一学期的C语言编程学习,在陆老师的教导下,也算是初步进入了编程这个世界因此,我总结了几点学习C语言的心得: 一明确学习目的 学习编程对大多数IT业人员来说都是非常有用的学编程,做一名编程...
  • c语言学习心得.doc

    2020-11-18 00:12:00
    c语言学习心得 篇一学习 C语言 心得 C语言学习心得 刚开始学C语言的时候很迷茫在此之前从没有接触过C语言有点摸不着头脑可是在上机过后我觉得编程是很有趣的一件事我知道要学好C语言不容易可是我决定 =完成这件不...
  • c 语言学习心得体会 5 篇 篇一 C 语言实践心得体会范文 C 语言实践心得体会范文在科技高度发展的今天计算 机在人们当中的作用越来越突出而 c 语言作为一种计算机 的语言我们学习它有助于我们更好的了解计算机与计 算...
  • C语言学习心得体会 c语言学习心得体会 c语言作为一种计算机的语言我们学习它有助于我们更好的了解计算机与计算机进行交流其语言功能丰富表达能力强使用灵活方便既具有高级语言的优点又具有低级语言的许多特点适合...
  • C语言学习心得.docx

    2020-07-06 16:53:31
    C语言学习心得 c语言学习心得1 还记得刚上第一节c语言课的时候基本上一节课只有最后10分钟的内容听懂了在此之前从没接触过c语言想说看看书预习一下吧可是完全找不到条理发现老师也不是按书上的顺序讲的当时就特别...
  • c语言学习心得体会 篇一C语言学习心得体会与总结 c语言程序学习心得体会 通过一学期对c语言的学习我感觉学习 c语言是有一 定难度却又是非常有趣的科目也是很有帮助的特别是对 将要面对的计算机二级考试 这段时间的...
  • C语言学习心得5篇集合 c语言是在国内外广泛使用的一种计算机语言其语言功能丰富表达能力强使用灵活方便既具有高级语言的优点又具有低级语言的许多特点适合编写系统软件今天为大家带来几篇c语言学习心得 c语言学习...
  • 大学c语言学习心得感想 大学c语言学习心得感想篇1 学习C语言已经一年多对C也算得上半个入门者期间也写过一些自娱自乐的代码其实个人认为无论学习什么语言最重要的是掌握习编程思想然而C语言一种学习编程思想的基础...
  • PAGE PAGE # 大学c语言学习心得体会范文 通过大学c语言的学习自己编好程序上机调试运行时可能有 很多你想不到的情况发生通过解决这些问题可以逐步提高自己对 c语言的理解和程序开发能力在此分享心得体会范文下面是 ...
  • 学期小结C语言学习心得 在刚开始学习C语言的一段时间里我总觉得C语言难懂和不容易使用现在总结起来主要是以下三个方面的原因 1只注重写程序而忽视了读程序 学习计算机语言最好的方法是什么很多人都认为是掌握程序...
  • 单片机c语言学习心得.doc
  • XXXX年c语言学习心得体会 C语言学习经历(1116字)C语言是一种国内外广泛使用的计算机语言 其丰富的语言功能强大的表现力灵活方便的使用兼具高级语言的优点和低级语言的诸多特点适合编写系统软件 其强大的功能不仅广泛...
  • c 语言学习心得体会一c 语言学习心得体会 c 语言作为一种计算机的语言我们学习它有助于我们更好的了解计算机与计 算机进行交流因此c 语言的学习对我们尤其重要 在这个星期里我们专业的学生在专业老师的带领下进行了 ...
  • C语言学习心得体会5篇.doc
  • c 语言学习心得体会 c 语言作为一种计算机的语言我们学习它有助于我们更好的了解计算 机与计算机进行交流其语言功能丰富表达能力强使用灵活方便既具 有高级语言的优点又具有低级语言的许多特点适合编写系统软件其...
  • 单片机c语言学习心得[整理].doc
  • 我的C语言学习心得

    2020-02-01 16:15:53
    我的C语言学习心得 位、字节和字 * 位(bit):可以容纳两个值,0或1 * 字节(byte):1个字节是8位 * 字(word):根据电脑而定,原始的Apple机是8位,现在的计算机是32位或64位 * 不同的数据类型在不同的计算机中...

    我的C语言学习心得

    位、字节和字

    位(bit):可以容纳两个值,0或1
    字节(byte):一个字节是8位
    字(word):根据电脑而定,原始的Apple机是8位,现在的计算机是32位或64位

    • 不同的数据类型在不同的计算机中占用不同的字节,如int在32位平台的内存中占四个字节,而在16位平台的内存中占两个字节

    i++与++i的区别

    在for循环中,二者的实现结果是一样的,不同的是++i的速度更快,因为编译器不需要保存临时变量i,只有在做非常大的循环的时候才可能注意到这一点速度差异。

    int a = 0;
    int b = ++a;   //结果是 a = 1; b = 1;
    }
    {
    int a = 0;
    int b = a++;   //结果是 a = 1; b = 0;

    i++ :先引用后增加,先在i所在的表达式中使用i的当前值,后让i加1
    ++i :先增加后引用,让i先加1,然后在i所在的表达式中使用i的新值

    存储类


    5种存储类

    存储类时期作用域链接声明方式
    自动自动代码块代码块内
    寄存器自动代码块代码块内,使用关键字register
    具有外部链接的静态静态文件外部所有函数之外
    具有内部链接的静态静态文件内部所有函数之外,使用关键字static
    空链接的静态静态代码块代码块内,使用关键字static

    自动存储类:属于自动存储类的变量具有自动存储时期、代码块作用域和空链接。默认情况下,在代码块或函数的头部定义的任意变量都输入自动存储类。也可使用关键字auto显式的表达,如下所示:

    int main(void)
    {
    auto int plox;   // 等效于 int plot;
    }
    

    寄存器变量:寄存器变量多是存放在一个寄存器而非内存中,所以可以比普通变量更快的被访问和操作,但是寄存器是没有地址的。因此,除了无法获得寄存器变量的地址,在其它许多方面,寄存器变量和自动变量是一样的。通过使用关键字register可以声明寄存器变量。

    具有外部链接的静态变量: 具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。这一类型有时被称为外部存储类(external storage class),这一类型的变量被称为外部变量(external variable)。把变量的定义声明放在所有函数之外,即创建了一个外部变量。在函数中使用外部变量时,通过关键字extern来再次声明它。如果变量是在别的文件中定义的,必须使用关键字extern来声明该变量。

    具有内部链接的静态变量: 这种存储类的变量具有静态存储时期、文件作用域及内部链接。通过使用关键字static在所有函数外部定义。具有内部链接的静态变量只可以被与它在同一个文件中的函数使用。

    空链接的静态变量: 用于具有代码块作用域的变量声明。使用关键字static进行声明。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,015
精华内容 6,406
关键字:

c语言学习心得

c语言 订阅