C#函数式编程(乘风破浪的姐姐第三季)
972
2022-08-15
入门C语言必看!C语言哪些知识是需要背的?(c语言的一些基本知识)
C语言作为编程语言的开山鼻祖,语言不仅简洁,使用也比较方便灵活,并且在数据处理尤其是图像处理能力强,可移植性好。从而迅速在全世界普及和推广。所以吸引了很多人选择编程,选择C语言。
“既然选择了远方,便只顾风雨兼程”,那既然选择了C语言,又需要学习哪些知识呢?本文就给大家介绍学习C语言必背知识点,希望能对大家有所帮助。
关键字
ANSI C 共有32个关键字和9种控制语句,按照惯例编一首打油诗。
while signed for return,unsigned case continue default.
register goto auto union, do short long struct.
void typedef switch extern, volatile char double const.
if break static int, enum sizeof else float.
在C99中,又增加了5个关键字inline restrict _Bool _Complex _Imaginary, 后来的C11中又增加了7个关键字_Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic, 所有这些关键字,不但要有所了解,还要知道其典型的应用场景。
数据结构
C语言为用户提供了丰富的数据结构,还允许用户自定义复杂的数据结构。C语言提供的数据结构是以数据类型的形式给出的,C的数据类型划分如下:
基本类型
数值类型
字符类型
枚举类型
构造类型
数组类型
结构类型
联合类型
指针类型
数据有常量与变量之分,习惯上用大写字母代表常量,用小写字母代表变量。数值类型要注意数的范围不同。字符常量是用单引号括起来的一个字符,还允许以一个“\”开头的特殊字符常量。枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。在编译中,对枚举元素按常量处理,故称枚举常量,它们不是变量,不能对它们赋值。
数组是有序数据的集合,数组中每一元素都属于同一数据类型,用一个统一的数组名和下标来唯一的确定数组中的元素。结构体是C语言提供的一种数据结构,一般形式如下:
struct 结构体名字
{
成员列表
} 变量名列表;
一般地,可以利用宏取得结构内的偏移量:
#undef offsetofstruct #define offsetofstruct(TYPE, ELEMENT) ((size_t) &((TYPE *)0)->ELEMENT) #endif
联合也是一种派生类型,语法和结构体相同,不同是它的成员共享存储空间。联合定义了一组可供选择的值,它们共享一块内存。
一个变量在内存中的地址就称为该变量的指针,这是C语言中的精华,下面单独描述。
C语言还提供了十分丰富的运算符,主要有如下34种:
算术:+、-、*、/、++等
关系:>、<、==、!=等
逻辑:&&、||、!等
位:>>、<<、~等
赋值:等号(=)及其扩展赋值运算符(+=、-=、*=、/=等)
指针:*、&
用各种运算符将运算对象连接起来形成了表达式。
指针
C 语言的核心是指针,其灵活性和超长之处源自于指针。指针提供了动态操控内存的机制,强化了对数据结构的支持,且实现了访问硬件的功能。
指针是一个存放内存地址的变量。定义一个指针时,必须规定它指向的变量类型。任何指针都是指向某种类型的变量。当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看。要注意区分指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。
void指针类型,即不指定它是指向哪一种类型数据的指针变量。void指针它可以指向任何类型数据,可以用任何类型的指针直接给void指针赋值。但是,如果需要将指针的值赋给其它类型的指针,则需要进行强制类型转换。在指针定义语句的类型前加const,表示指向的对象是常量。
指针变量可以指向另一个指针,指针的指针。程序中的函数代码同样也占有内存空间,每个函数都有地址,因此指针同样可以指向函数,指向函数地址的指针称为函数指针。总之,指针可以指向什么是没有限制的,可以是变量、数组元素、动态分配的内存块以及函数。
正确理解指针变量和函数指针的声明,例如:(*(void(*)())0)();注意*p()和(*p)()的区别,前者含义是函数返回值为一个指针类型,后者含义p是一个指向函数的指针。
指针的典型用法:
直接访问系统内存
引用函数
构造链式数据结构
引用动态分配的数据结构
实现引用调用
传递数组参数
访问和迭代数据元素
代表字符串
作为其他值的别名
函数
一个大程序可分为若干个小程序模块,每一个模块用来实现一个特定的功能,这个模块称为函数。一个C程序可由一个主函数和若干子函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任何多次。
从用户来看,可以将函数分为库函数和自定义函数。从函数自身看,可以分为有参数和无参两种。传参过程中要根据需要进行值传递和地址传递,也就是形参和实参。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
函数应当在同一文件中它被调用的位置之前定义,否则就会默认返回值是整型。如果调用函数处和被调用函数不在同一文件,且返回值类型不同,连接时会报错。如果被调用函数参数包括char、short、float等类型,则在调用该函数的文件中必须声明该函数,且括号内带上参数类型。
本质上,函数表示法就是指针表示法,函数名称经过求值会变成函数的地址,然后函数参数会被传递给函数。
程序栈是支持函数执行的内存区域,通常和堆共享,包括返回地址,局部数据存储,参数存储,栈指针和基指针(运行时管理栈的指针)。系统在创建栈帧时,将参数以跟声明相反的顺序推到帧上,最后推入局部变量。
从函数返回指针时可能存在的潜在问题:
返回未初始化的指针
返回指向无效地址的指针
返回局部变量的指针
返回指针但是没有释放内存
函数指针可以 以编译时未确定的顺序来执行函数。
void (*foo)()
使用函数指针时一定要小心,因为c 不会检查参数传递是否正确,建议使用fptr作为前缀。函数指针数组可以基于某些条件选择要执行的函数。传递指针的指针可以让参数指针指向不同的内存地址。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~