成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言該怎么進階?你學會了嗎?

開發 前端
初學者在這段代碼里出的錯誤,基本都是忘了打結尾的分號,或者使用了中文字符而導致的。學會了這段代碼之后,C語言就可以算入門了。

?C語言的入門還是很簡單的:

#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}

把這段代碼輸入文本編輯器vim,保存成hello.c文件:文件里的符號全是英文字符,別把分號打成中文字符。

然后用gcc編譯器它,命令為:gcc hello.c

獲得一個可運行的a.out文件,在命令行里直接運行它:./a.out

可以看到打印的hello world字符串。

如果gcc編譯出來的a.out文件沒有自動加執行權限,可以自己加上,命令為:

chmod +x a.out

初學者在這段代碼里出的錯誤,基本都是忘了打結尾的分號,或者使用了中文字符而導致的。

學會了這段代碼之后,C語言就可以算入門了。

這段代碼雖然很短,但涉及到了頭文件、宏、函數、字符串/數字 常量、return 語句,涵蓋了C語言50%的常用語法吧?

剩下的語法,就是一些運算符、if else、while for、switch case等語句類型。

1.C語言入門階段的最后一關,是指針。

指針,是一個表示變量的內存地址的無符號整數,位數跟CPU的字長相同。

64位機上,指針是8個字節。

老式的32位機上,指針是4個字節。

指針的字節數,跟long類型的整數一樣。

int a[10];
int * p = a;

數組的指針,指的是數組的“首地址”:數組的第0號元素的內存地址。

C語言從0開始編號,數組元素的內存地址與它的編號一一對應:

&a[i] == (unsigned long)a + i * sizeof(a[0]);

所以,指針是一個unsigned long型的(無符號)整數。

指針變量,是一個保存某種類型的數據的內存地址的變量。

指針的類型,是它指向的數據的類型。

指針的++和--運算,一次跳過(它指向的)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環境高級編程?

這本書的作者理查德-史蒂文斯1999年就過世了,但他的書依然是最好的Linux編程書。

當然,最主要的參考資料還是Linux的man手冊:在命令行里輸入man open,就可以打開open()函數的手冊,里面有open()函數的詳細用法。

把man open換成man socket,就可以打開socket函數的手冊。

對同一個詞的介紹,在man手冊里可能有好幾頁:一個是對同名的Linux命令的介紹,另一個是對同名的Linux函數的介紹。

如果直接man open打開的不是函數介紹,可以用man 2 open,或者man 3 open等,通過數字去選頁數。

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:創建socket描述符,即網絡文件的句柄。

Linux上一切都是文件,socket也被看做一個文件。

bind:綁定socket到某個IP和端口號。

listen:讓socket進入監聽狀態,用于服務器端監聽某個IP和端口號。

accept:用于服務器端接受用戶的連接。

connect:用于客戶端連接到服務器。

send / recv:TCP協議的數據發送和接收。

sendto / recvfrom:UDP協議的數據發送和接收。

關閉socket,也是使用close()函數。

4)epoll_create, epoll_wait, epoll_ctl

Linux的epoll異步事件機制,

用于同時監控多個socket網絡連接的讀寫狀態,并進行高并發的異步處理,它是網絡服務器的核心函數。

俄羅斯人寫的Nginx服務器,底層就是這3個函數。

nginx

5)setsockopt / getsockopt

設置或讀取網絡socket的狀態,細節參考Linux man手冊。

getsockopt的其中一個應用就是,它在異步連接時用于讀取連接的錯誤碼:相當于connect()函數的返回值,只是這個過程在異步獲取的。

6)fork / execve

fork:以當前進程為藍本,創建一個子進程。

execve:給當前進程加載一個新的可執行程序,并替換它的用戶內存空間。

在多進程編程里,這2個是基本的函數,但一般并不常用。

多進程的網絡服務器Nginx,就是用fork()創建多個進程的。

7)pthread_create

Linux上的pthread線程庫的函數,用于在當前進程里創建一個線程。

pthread系列函數,也是一組跟多線程編程的函數。

4.匯編語言

不會匯編語言的C程序員,不是好程序員?

實際上,想學明白C語言的話,還是要學匯編語言。

不會匯編語言的話,像全局變量、局部變量、動態庫、內存、操作系統這些跟C語言有關的東西,也是很難學明白的。

C語言,既是個大號的匯編語言,又是個OS的應用層膠水。

C語言,既離不了匯編語言,也離不了OS。

匯編語言就3個關鍵:內存、寄存器、棧。

這條匯編代碼運行之前,內存什么狀態、寄存器什么狀態、棧是什么狀態?

這條匯編代碼運行之后,內存什么狀態,寄存器什么狀態,棧是什么狀態?

記住這6個狀態,也就學會了匯編語言了。

5.算法

算法關系到數學,算法導論是最好的參考資料。

當然,數學越好,越容易學算法。

但OpenCV開源之后,大多數情況下,用不到自己寫算法?

跟圖像處理、視覺識別相關的算法,OpenCV幾乎都有。

算法工程師做的,更多是把這些基礎算法整合成一個特定場景的識別模型。

6.圖形界面

C語言可以選各種圖形界面庫,例如GTK,SDL,QT,etc.

想做界面程序的話,選一種自己看著順眼的圖形庫,然后熟悉一下它的C語言API就行了。

一般來說,圖形庫的API都是支持多種語言的,C語言也是其中之一。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-08-08 08:23:08

Spring日志?線程池

2022-11-09 07:20:43

調用日志502報錯nginx

2024-05-09 08:14:09

系統設計語言多語言

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2024-09-10 10:34:48

2024-12-31 00:08:37

C#語言dynamic?

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2024-07-31 08:39:45

Git命令暫存區

2023-12-12 08:02:10

2023-01-30 09:01:54

圖表指南圖形化

2024-08-06 09:47:57

2022-07-08 09:27:48

CSSIFC模型

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2024-11-28 10:32:32

2022-03-08 08:39:22

gRPC協議云原生
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久免费看 | 国产在线色 | 青青草av在线播放 | 欧美在线一区二区三区四区 | 你懂的国产 | 91极品视频 | 成人免费视屏 | 永久免费av | 欧美中文字幕在线观看 | 天天干夜夜操 | 国产精品一区三区 | 国产午夜精品视频 | 91成人在线 | 国产7777 | 波霸ol一区二区 | 91成人精品| 成人精品视频 | 亚洲国产欧美一区二区三区久久 | 成人做爰9片免费看网站 | 91久久久久 | 久久久久久亚洲 | 久久在线| 成人免费精品视频 | 欧美综合视频在线 | 日本二区| 欧美理论片在线观看 | 欧美片网站免费 | 在线观看av网站永久 | 国产网站在线免费观看 | 国产成人免费视频 | 日韩在线免费视频 | 亚洲一区二区成人 | 亚洲欧洲国产视频 | 中文字幕不卡视频在线观看 | 北条麻妃视频在线观看 | 午夜一区二区三区在线观看 | 久久综合久久综合久久综合 | 蜜桃在线一区二区三区 | 亚洲天天干 | 六月成人网 | 中文字幕成人在线 |