C语言语法总结
写在开篇:本篇文章适合C语言初学者和想梳理和回顾一下C语言整体语法的看官,由于考虑不要对初学者灌以较深的知识点而让其失去学习的兴趣,本篇文章知识点比较全面且不深,请看官自己决定是否阅读以免浪费您宝贵的时间!
C语言作为一种底层面向过程语言,在编程语言中有着举足轻重的地位,基本上“科班”出身的计算机系学生第一个接触的编程语言都是C语言,因为笔者上大一的时候(2004年)也是学习了C语言,但是长时间没有运用了,所以对C语言知识点做一个梳理,也为后续开发FFmpeg音视频做一个坚实的基础。好的废话不多说,先来个HelloWorld镇楼:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
常用基本类型:
整型:short, int, long
short:16位,占2个字节
int:32位,占4个字节
long:32位,占4个字节
浮点型:float, double
float:32位,精度低
double:32位,精度高
注:浮点型适合做科学运算,但是计算速度相对慢,如果不是做科学计算,那么最好使用整型数据。
char型:8位,1个字节。只代表一个字符。
void型:一般使用指针的时候使用。
变量与常量:
int a = 0; //变量,可以进行赋值,其中的值可以更改的
const int len = 256; //常量,定义之后,值不可以再改变 const是关键字,需要写在前面
算术运算和比较运算:
算术运算:
+, -, *, /, %:加/ 减/ 乘/ 除/ 余
比较运算:
>, ==, <, >=, <=, !=: 大于/ 等于/ 小于/ 大于等于/ 小于等于/ 不等
流程控制语句:
条件控制语句if else:
if(a>b){
执行语句……;
} else {
执行语句……;
}
循环控制语句while, do while, for:
while(条件){
执行循环的语句……
}
do{
执行循环的语句……
}while(条件)
for(int i = 0; i < 10; i++){
执行循环的语句……
}
函数:
函数用来实现函数体中的功能,本着高内聚,低耦合的思想,在函数内部只针对函数要实现的功能做开发,而与其他的函数最好是没有关联。
void func(int i){
函数体
}
函数由返回值,函数名,参数,函数体组成。
文件操作:
C语言中对文件的操作是先定义一个FILE变量,然后对这个file变量进行操作
简单实例:
#include<stdio.h>
int main(int argc, char* argv[]){
FILE* file;
char buf[1024] = {0,};
file = fopen("1.txt", "a+");
fwrite("hello, world!", 1, 13, file);
rewind(file);
fread(buf, 1, 20, file);
fclose(file);
printf("buf = %s\n", buf);
return 0;
}
a+:表示addition,如果1.txt存在则在1.txt文本内容的后面追加内容,如果不存在1.txt,则创建1.txt。
fwrite中的参数:第一个参数是你要写入的内容,第二个参数是第一个参数中每个字符占几个字节,第三个参数是第一个参数一共多少个字节,第四个参数是要写入那个文件中。
fread中的参数:第一个参数要将数据内容读到哪里,第二个参数是将这个内容按几个字节一份进行读取(例子中是一个字节一个字节的读),第三个参数是一共读取多少个字节,第四个参数是从哪里读取。
rewind:这个是让光标回到file的文本内容的首位(和数据库游标概念类似),否则光标停留在最后(因为前面fopen的时候输入的参数是"a+",意思是在最后追加)。
fclose:在使用完文件之后需要关闭这个文件。
指针:
指针是C语言的灵魂,没有学过指针相当于没学过C语言。
指针存放的是指向某个值的地址,关键字是*
int *a 这里a存放的是指向*a值的地址,&a存放的是指向a的地址
这里稍微提及一下操作系统是如何管理内存的。下面三个概念需要了解一下:栈空间,堆空间和内存映射:
栈空间:我们每记录一个函数的时候,操作系统会给我们分配一段栈空间;而当函数退出的时候,操作系统又会回收这段栈空间。这就是为什么局部变量有作用域的原因。一般栈空间的大小是4M-8M。
堆空间:操作系统为每个进程一般赋予4G左右的空间,操作系统会占1G,剩下3G都是堆空间的。堆空间一般存放全局变量和静态变量。
内存映射:磁盘中的文件映射到内存中,只要对内存中的更改,磁盘也会更改,这样会大大提升速度,一般运用在数据库操作。
指针如何分配和释放内存?
分配空间:
void* mem = malloc(size);
释放内存:
free(mem);
使用malloc关键字,接后面参数的大小,就分配了堆空间的内存。在分配内存并使用之后一!定!要!释!放!掉!之前分配掉的内存,要不然会出现内存泄漏的情况,内存泄漏多了就会产生内存溢出的现象。当然还有一种情况是野指针,野指针是指占用了别人的内存,当你已经释放了内存之后,别人申请了这块内存,你就不能继续再用这块内存了。
函数指针:
返回值类型(*指针变量名)([形参列表]);
int func(int a, int b); /* 声明一个函数 */
int (*f)(int a, int b); /* 声明一个函数指针 */
f = func; /* 将函数func的首地址赋值给指针f */
函数指针的优点在于:一个函数指针可以指向不同的函数,也就是不改变函数名字的前提下,可以让函数有不同的行为(类似于java的多态)。
结构体:
结构体有点类似于OOP中的class,但是不同的是其中只能定义变量不能定义方法。
关键字struct,相当于自定义类型。
struct st{
int a;
int b;
};
使用的时候需要写全 struct st sst, 然后使用“.”来调用定义的成员变量 sst.a = 10, sst.b = 20
枚举类型:
枚举的意义在于限制了枚举类型的对象只能在一个限定范围中去选择。
enum e_type{
red = 0,
green,
blue
};
使用的时候需要写全 enum e_type et, 然后使用“.”来调用定义的成员变量 et.red
需要注意的是枚举中的变量是自增1的,green就是2,blue就是3。
网友评论