当前位置: 首页 > 科技观察

C语言如何进阶?你学会了吗?

时间:2023-03-13 07:12:40 科技观察

C语言的介绍还是很简单的:#includeintmain(){printf("helloworld\n");return0;}在文本编辑器vim中输入这段代码并保存如hello.c文件:文件中的符号都是英文字符,不要把分号打成汉字。然后用gcc编译,命令是:gcchello.c得到一个可执行的a.out文件,直接在命令行运行:./a.out,可以看到打印出来的helloworld字符串。如果gcc编译出来的a.out文件没有自动添加执行权限,可以自己添加。命令是:chmod+xa.out,或者是使用汉字造成的。学完这段代码,C语言也算是入门了。这段代码虽然很短,但是涉及到头文件、宏、函数、字符串/数字常量、return语句,涵盖了50%的C语言常用语法。剩下的语法是一些运算符,ifelse,Whilefor,switchcase等语句类型。1、C语言入门阶段的最后一关是指针。指针是一个无符号整数,表示变量的内存地址,位数与CPU的字长相同。在64位机器上,指针是8个字节。在老式的32位机器上,指针是4个字节。指针的字节数与long类型的整数相同。诠释[10];整数*p=一个;数组的指针指的是数组的“首地址”:数组第0个元素的内存地址。C语言从0开始编号,数组元素的内存地址与其编号一一对应:&a[i]==(unsignedlong)a+i*sizeof(a[0]);因此,指针是一个无符号长整型(无符号)整数。指针变量是保存某类数据的内存地址的变量。指针的类型就是它指向的数据类型。指针的++和--操作一次跳过1个元素的字节数:int指针的++和--的变化是sizeof(int)字节。在大多数系统上,sizeof(int)==4.2。C语言的文件读写与操作系统有关。C语言的文件函数上图是C语言的文件函数,下图是Linux的文件函数。C语言标准库的文件函数,最终也是使用了OS的系统调用(其他语言的标准库也是如此)。操作系统为了向应用层提供功能,有一套API,其中重点是文件和网络编程的API。API一词来源于windows,在Linux上一般称为系统调用(syscall)。Linux的文件功能windows有自己的应用程序编程框架(C#,VS),而windows上的C语言是VC++支持的:VC++,VS中的C++现在,C语言的应用程序编程主要是在Linux上。Linux系统调用是C程序员在学习了基础内容后下一阶段应该熟悉的东西。Linux继承了Unix,其API与Unix相差无几:要熟悉Linux系统,最好的参考资料是旧书:《Unix环境中的高级编程》RichardStevens,本书作者1999年逝世,但他的书仍然是最好的Linux编程书籍。当然,最重要的参考资料是Linuxman手册:在命令行输入manopen可以打开open()函数的手册,里面有open()函数的详细用法。将manopen替换为mansocket来打开socket函数的手册。对于同一个词的介绍,man手册中可能有好几页:一页是linux同名命令的介绍,另一页是linux同名函数的介绍。如果直接manopen不是功能介绍,可以使用man2open,或者man3open等,通过数字选择页数。3、Linux常用函数:1)open、close、read、write、fcntl都是与文件相关的函数,其功能与函数名相同。fcntl:可以对文件进行加锁,对socket设置非阻塞。使用比较复杂,可以参考man手册。2)lseek把文件指针移到哪里,用法和C库的fseek一样。3)socket、bind、listen、accept、connect、send/recv、sendto/recvfrom都是网络编程API,socket:创建套接字描述符,即网络文件的句柄。Linux上一切都是文件,socket也算是文件。bind:将套接字绑定到某个IP和端口号。listen:让socket进入监听状态,用于服务器监听某个IP和端口号。accept:用于服务器接受用户连接。connect:用于客户端连接到服务器。send/recv:TCP协议的数据发送和接收。sendto/recvfrom:UDP协议数据发送和接收。要关闭套接字,还可以使用close()函数。4)epoll_create、epoll_wait、epoll_ctlLinux的epoll异步事件机制,用于同时监听多个socket网络连接的读写状态,进行高并发的异步处理。它是网络服务器的核心功能。俄罗斯人写的Nginx服务器底层就是这三个函数。nginx5)setsockopt/getsockopt设置或读取网络套接字的状态,详见Linuxman手册。getsockopt的一个应用是用于异步连接时读取连接的错误码:相当于connect()函数的返回值,但是这个过程是异步获取的。6)fork/execvefork:基于当前进程创建子进程。execve:加载一个新的可执行程序到当前进程并替换它的用户内存空间。在多进程编程中,这两个是基本函数,但一般不常用。多进程Web服务器Nginx使用fork()创建多个进程。7)Linux上pthread线程库的pthread_create函数,用于在当前进程中创建一个线程。pthread系列函数也是与多线程编程相关的一组函数。4、汇编语言不懂汇编语言的C程序员不是好程序员。其实,要想学好C语言,还是得学汇编语言。如果不懂汇编语言,全局变量、局部变量、动态库、内存、操作系统等C语言相关的东西也很难学。C语言不仅是一门大型汇编语言,还是操作系统应用层的粘合剂。C语言,汇编语言和OS都离不开。汇编语言具有三个键:内存、寄存器和堆栈。这段汇编代码运行前,内存是什么状态,寄存器是什么状态,栈是什么状态?这段汇编代码运行后,内存是什么状态,寄存器是什么状态,栈是什么状态?记住这6个状态,你就会学会汇编语言。5.算法算法与数学有关,算法入门是最好的参考资料。当然,数学越好,学习算法就越容易。但是OpenCV开源之后,在大多数情况下,你不需要自己写算法,图像处理和视觉识别相关的算法,OpenCV几乎都有。算法工程师做的更多是将这些基础算法集成到特定场景的识别模型中。6、图形界面C语言可以选择多种图形界面库,如GTK、SDL、QT等,如果你要做界面程序,选择一个看起来顺眼的图形库,然后熟悉它的C语言API。.一般来说,图形库的API支持多种语言,C语言就是其中之一。