背景简介
C语言是一门编译性语言,对于运行环境的依赖性性较高,但是有C程序以自身贴近操作系统的编程风格为其优秀的性能打下了扎实的基础。其涉及范围主要面向操作系统,驱动,嵌入式,物联网等贴近操作系统,以及计算机底层的操作系统类编程。
C语言编程划分方向(主要是linux方面)
C语言在linux的编程主要分为操作系统编程,以及网络编程。
(1)操作系统类编程是指一般的涉及linux各大模块的一个api进行调用,使用相关功能完成一定的业务。按照内核几大模块来讲,就是进程,内存,进程间通信(socket,管道,消息队列,信号量,共享内存),虚拟文件系统,网络接口;
(2)网络编程方面是通过网络socket接口,recv,send,sendto,recvfrom等网络接口进行网络数据的交互,大家在进行这一部分的学习的时候可以先去了解一下TCP/IP协议,TCP三次握手,四次挥手协议,滑动窗口协议,TCP网络拥塞的四个阶段(慢启动,拥塞避免,快速重传,快速恢复)
一个C基本程序的组成
先给出大家一个最熟悉的例子
main.c
#include<stdio.h>
int main()
{
printf("hello");
}
上面的#include指令是#开头,表示预处理命令,也就是说它会在预处理阶段被处理,毕竟是指令,include代表将stdio.h头文件中的内容加入到当前文本中,为什么呢? 因为我们用到了它里面声明的一个函数printf,加入我们的程序用到了printf但是没有添加头文件,那么就会在链接期间找不到对应的符号导致编译错误。因此如果我们用到了外部api的函数接口,都应该将对应的函数所在头文件用incldue导入进来
接着看下面的int main{}语句块,它是 type func(){} 这样的结构,因而是一个函数,C/C++程序的特色就是由若干个基本的函数功能单位组成,函数是C语言完成任务的基本单位。它们基本都长成下面的样子
return_value_type function_name(argument_list)
{
some statement or functions
}
return_value_type代表返回值类型,C/C++程序要求程序的函数带返回值,并且明确类型。
function_name为函数名,是一个符号地址,起名按照正常的标识符来,最好是驼峰式的如completeSayHello,或者是unix风格命名comlete_say_hello
argument_list是参数列表,以type argument_name的key,value对出现如int swap(int a,int b)
{}为一个函数的body,即为函数体。函数体一般用于构建我们想要的功能。比如最简单的交换变量的值
void swap(int* a,int* b)
{
if(a==NULL || b==NULL) //对于空指针进行判断,防止内存的非法访问,对有空指针的情况,直接返回
{
fprintf(stderr,"NULL illegal\n")
return ;
}
//进行相关功能代码编写
int c=*a; *a=*b; *b=*c;
} //函数体结束
一些常用类型
字符串类型,C字符串使用char* 来进行表示的,C字符串以‘\0’结尾,占用c字符串的一个字节长度.sizeof(*a)=strlen(a)+1
数组类型,以[]操作符号进行定义和操作,如
int a[100];
int sum=0;
for(int i=0;i<100;i++)
{
sum+=a[i];
}
结构体类型
struct node{ //定义一个节点,一个int类型的value以及前后节点指针
int value;
struct node* next;
struct node* prev;
};
联合体结构,多个变量共享一段内存空间,其结构的大小取决于定义union中占用内存空间最大的那一类型的大小
union val_hook{
int condion_1;
int condition_2;
}; //sizeof(val_hook)=4 not 8
union val_hook{
int condition_1;
char condition_2;
} //sizeof(val_hook)=4
网友评论