C语言具有简洁紧凑,灵活方便,运算符丰富,数据类型丰富,表达方式灵活实用等特点,所以C语言程序设计更主动、灵活。很多人从C语言入门编程,下面整理了一些C语言基础知识,希望对大家有所帮助!
1.C语言中,变量必须先声明后使用,即一个程序块(花括号对)中所有临时变量必须在第一条可执行语句之前全部声明,而不能像C++那样随用随声明;
2.C语言中参数传值传递形参,即为参数的拷贝,此与C++/JAVA相同,同时值得注意,ANSI C不支持引用,此与C++/JAVA有区别,那么要对参数进行修改只能使用指针方式(指针传值指针本身仍是形参,要修改指针本身那必须使用双重指针);
3.C语言默认类型为int,即参数无类型或函数无返回值类型声明,则认为是int(貌似一些编译器不支持),同时不建议使用该特性;
4.无参数的函数声明应当使用void表明,否则C语言按照老式声明方法忽略参数类型检查;
5.全局变量建议全大写,局部变量建议全小写,内部变量31个字符有效,外部变量不区分大小写,仅6个字符有效,所以必须保持唯一性;
6.ANSI C是按照多字节实现的,UNICODE是后来发展的,所以有char/WCHAR,与.NET中char直接是双字节有区别,在C#中导入dll时值得注意;
7.C语言支持枚举,并且枚举和int直接强制类型转换即可,比.NET方便;
8.#define声明宏定义直接在编译时替换,不进行类型检查,const声明常量则可以进行类型检查;
9.运算符的优先级记忆比较麻烦,还是()可靠;
10.goto并不是一无是处,在不考虑程序可读性的情况下可能获得更高的效率;
11.函数实际也可以与特殊的类型相对应,那样对于理解函数指针比较方便,函数为外部类型;
12.static用于全局变量和函数则限定该变量和函数的使用范围仅为该源文件(从而无需考虑与其他源文件不得重名),用于函数内部变量则该变量的内存分配和回收不再同于普通临时变量(调用函数生成,函数返回销毁),而是一直存在于静态变量区,从而可以保存一些状态;
13.头文件的作用体现在调用其他源文件时不需要再次写函数定义,所以实现函数是不需要头文件的,调用时才需要,可以采用富头文件定义一大组接口,然后使用多个源文件分别实现;
14.寄存器变量使用register声明,仅适用于使用频率高的局部变量(含形参)(受限于底层硬件,不一定会被分配到寄存器,但是这么写不影响效率);
15.全局变量和静态变量默认初始化为全零且仅初始化一次,局部变量默认初始化为未定义且每次都会重新初始化;
16.递归调用的方法一般比较紧凑,但是每次调用会单独维护调用的`堆栈,所以效率不是最高;
17.#include的作用体现于将一些内容避免重新写一遍(主要是类型、函数和外部变量定义),所以实际上不一定为h文件;
18.表示一行尚未结束,对于定义长的字符串和define比较有用;
19.函数调用的执行顺序不确定,所以对于a()+b()这样函数中使用相同变量并且改变其值的需要借助临时变量处理,防止不同实现的调用顺序不一致;
20.##用于宏定义中连接前后两个部分,如cat(a, b) a ## b;
21.指针是C/C++的重要内容,当然也是双面刃,用好了很方便而且高效,用不好那就造成程序不稳定;
22.使用va_list, va_start, va_arg, va_end来定义可变参数的函数,通过va_start函数中的第一个不变参数将va_list指向参数列表(函数调用的栈中),然后通过va_arg获取每个参数并将va_list移动指定类型的长度,最后则通过va_end完成必要的回收工作,需要指出的是va_arg没有结束边界,所以比较有效的方式有两种,一种对于参数类型一致,则可以第一个参数指出后续参数的总数,然后依次获取,另一种对于不同类型的参数混用,则可以通过类型标识+参数配对的方式进行使用(第一个参数依然可以指定数量,当然也可以检查标识),从而避免最后读取无效的参数,对于可变参数仅支持int和double两种类型(参数未限定类型,故按照旧式声明理解)以及指针类型;
23.函数指针是用来在C语言中实现动态调用的比较有效的方式
24.结构体用作参数依然是拷贝为形参传递,这点与JAVA中全部对象都是类有区别(类的对象通过引用传值,C#支持struct),所以对于大的结构体事宜使用指针传递,而对于小的结构体拷贝传值效率并不低;
25.代码中字符数组为静态常量,对其操作无效,程序块中数组的声明是可以自动回收的,通过malloc/calloc分配的内存为堆内存,需要自行通过free回收;
sizeof获取数据类型的占用内存空间大小 按照我以为的思维 结果应该是result为0,num为10 但是现在结果是 result 0 num 是11 首先使用随机数 需要导入随机数的头部文件 如果以时间为随机种子需要导入 rand的取值范围是0 - 32767之间 例子如果去随机数5-15之间 那么 rand() % 11 + 5 取 a -b 之间 随机数公式 rand() % (b-a+1)+a 延迟的意思 Sleep(5) 延迟5毫秒必须要加入头文件 思考 那如果是{"测试","测试1","测试2","测试3","测试4"};这种的字符数组怎么定义? 如果改变 *指针变量名的值 原来的变量值也会改变 ---------- 拓展 ------------- 指针的值一般是 十六进制 %x 输出结果十六进制小写字母且去头部0详情看例子 注意指针变量赋值一定要用取地址符,不能直接赋值为十六进制的但是可以赋值为NULL int * test = NULL; 简单的例子 取指针变量的值 注意指针也有指针哦 通过这个例子我们知道数组名,他就是指针数组的首地址; 指针参与运算 我们知道输出指针名它是会输出十六位的内存地址的,所以每次运行指针像下位移,位移多少长度 我们这里定义的是double类型的数组,double占8个空间,所以每次运行ptr都像下运行8个位置 拓展指针运算 对比以下这几句,看看结果会是什么? 看运行结果我们对比下,在分析: 运行拓展第一次: 运行拓展第二次: 运行拓展第三次: 指针不止+1哦 数组的尾地址 二维数组的指针 理解字符串数组与字符指针的区别 我们可以发现 字符指针 只是把字符串的地址给了这个指针,而数组字符,则是开辟一个新的内存空间存放这个字符 常用的内置方法 malloc()动态分配内存 calloc()动态分配内存意义与malloc一致(推荐使用) 定义一个函数找到数组中某个数值的下标 这样就会改变外部变量!因为我们传了指针进去直接改变指针指向的值,当然会被改变 用法 这个例子中我们不加static 或者改成auto,那么结果打印始终是1,因为每次运行num函数中a都会被重新赋值为0; 新建.h为后缀名的文件 我们新建文件名为test.h 一般用来定义常量 extern申明变量在另一个文件中 如现在有两个.c文件 main.c 、test.c 如果test.c有个全局变量a 那么定义 嵌套结构 简化结构体的定义与使用 结构体中含有多个属性(结构体) 结构数组 这次我们把所有的功能放在头文件中使用 新建hero.h头文件以及hero.c hero.c我们先填几个玩家以及职业,后期可以拓展进行职业类的添加函数 结果: 或者传指针 我们创建两个文件一个《game.h》《game.c》 game.h game.c实现文件 运行效果 1、enum ->枚举 2、union多选一
C语言入门技巧,你看了吗 1、阅读一本有意义又不失学习乐趣的书一《C专家编程》 这本书描述了各种搞笑八卦的事,比如设计一个程序,检查楼道自动售货机中有没有可乐?冰不冰?用LISP去控制自己楼上的电梯升降;让电脑识别自己是否为真身,以免黑客把自己困在电梯里出不来等等。当自己为编程学习感到烦躁的时候,读一读很有效果的。 2、初入C语言的世界 开始学可C语言的时候,建议事先给自己一个规划,比如每天必学5小时,其中看书两小时,结合视频书籍操作三小时。 3、自选一本好教材 关干C语言学习的书籍实在太多,自选一本学习的书籍要万分慎重,在慎重考虑之后进行选择:《C语言大全第四版》很经典的一本书《C+Traps+and+Pitfalls》学过一段时间C语言后,读这本书对自己会有一定提升。《C语言参考手册》可以把它比作C语言中的新华字典,可以当成工具使用。《C程序设计语言》这本书是C语言的发明者K&R出版的书。 4、大量练习新手的C语言习题 网上有非常多简单的C语言练习题,下载下来不断练习反复练可。 5、数的类型,字符的类型的定义 一门语言的基础部分不过是一些关干数的类型,字符的类型的定义。最好的方法还是上机调试。在这一阶段做一些简单的程序。来明白C语言的编程环境,数字的类型。这样理解起来会更快些,也比较容易记忆。 6、顺序、循环 学习过程语言的一些基础模式:顺序与循环。切记它们是灵活多变的,死记硬背不过是白费力气!自己试着做些简单的程序,比如数据统计,一些简单的问答等。学习过程语言的一些基础模式:顺序与循环。切记它们是灵活多变的,死记硬背不过是白费力气!自己试着做些简单的程序,比如数据统计,一些简单的问答等。
C语言入门技巧亲测推荐 技巧 1: 不要使用“GOTO”语句 编程语言终究开始引入了函数的概念,即允许程序对代码进行断行。如果已经完成,不再使用goto语句来表示代码的断行。函数调用后,函数将回到下一条指令。 只要看到或想到qoto语句,就会让软件工程师退缩,产生本能 的厌恶。其中一个主要的原因是,一个遍布goto语句的程序会让让人很难抓住重心,不便于对程序的理解和维护 技巧 2: 使用FOR(; ;) 或While (1) 如果qoto语句已经过时,那么对程序创建无限循环应该如何去做呢,这是一些硬件工程师可能会疑惑的问题。毕竟,之前都是通过创建一个goto语句然后再返回到main语句。解决这一问题就要利用C语言中已经存在的循环语句for和while 技巧 3: 使用合适的条件语句 除代码的可读性之外,程序的执行时间还主要依赖干做决定时所选择的条件结构类型。许多硬件工程师都熟悉简单的if语句的使用。然而,有时工程师可能没有意识到如果第一个条件不正确,还可以使用else或else if语句。这可以节省处理器时间,而不必评估另一个条件语句。在列表5所示的前半部分代码中,如果Var值为1,则代码仍会查看Var是否为0。 技巧 4: 避免使用汇编语言 微处理器的自然语言为汇编语言指令。为低级别机器语言编程可能会为处理器提供更高效的代码。然而,人类并不是天生就会这种语言,并且经验表明,编写汇编语言会造成误解。误解会导致维护不当,更甚者,可能会使系统到处是bug。一般建议避免使用汇编语言。 实际上,现在大多数编译器都能编译出非常高效的代码。采用C语言或C++语言等高级语言的开发,能获得更有序的结构,便于理解和维护,使代码的整体效果更好。 技巧 5: 充分利用模块化 笔者最常见的经历是着手由硬件工程师开启的一个新项目往往是杂乱无章的代码组织。通常我们会发现,代码由一个单一的主模块组成,其中有2.5万多行代码。 C语言编程使工程师能够将代码分成独立的功能模块,这简化了代码导航,同时还能够使工程师使用封装等面向对象技术。代码可以被组织成逻辑模块,这很有意义。虽然可能要先花点时间(几分钟),但从长远来看,这将能省掉很多漫长之夜,和很多调试之苦! 技巧 6:使用描述式变量名称 编写易干理解和维护的较大软件有许多障碍,其中之一就是变量的命名习惯。为了尽力缩短变量名,开发者通常会自创一些较短的令人费解的助记符,往往只有他们自己才能明白的符号。现代语言使一个变量名可以包含数百个字符。 “直截了当”地方为了让事情清晰明确,法要好干其它方式。因此,变量名一目了然不仅有利于开发人员,也有利于未来的维护团队。 技巧 7:少用#pragma语句 C语言中有一种特殊的#pragma语句。这些语句通常处理非标准的句法和特性,应尽可能避免使用这种语句,因为它们是非标准的不能从一个处理器移植到另一个处理器。