原创 進程調度算法

調度也稱dispatcher 這是內核的主要職責之一就是決定該輪到哪個任務運行了多數實時內核是基於優先級調度算法的每個任務根據其重要程度的不同被賦予一定的優先級基於優先級的調度法指CPU 總是讓處在就緒態的優先級最高的任務先運行然而究竟何

原创 函數的可變參數解析

實現一個函數可以求任意個參數的平均值 #include <stdio.h> #include <stdarg.h> int average(int n, ...) { va_list arg; //聲明一個va_list類型的變

原创 main函數的參數解析

下面我們看一下main函數的原型: int main(int argc char* argv[],char* envp) { program-statements } 其實main函數有三個參數: 第一個參數:argc是個整型

原创 淺談函數調用,開闢棧幀的過程

函數的調用過程其實就是開闢棧幀的過程,首先了解一下棧的特性和幾個常用的寄存器。 棧:棧先進先出。 棧是從高地址向低地址延伸的。每個函數的每次調用,都有它自己獨立的一個棧幀,這個棧幀中維持着所需要的各種信息。寄存器ebp指向當前的棧幀的底

原创 回調函數

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調⽤,而是在特定的事件或條件發⽣時由另外的⼀方調⽤的,

原创 函數指針數組的應用

函數指針數組的用途:轉移表 例子:計算器 #include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { retur

原创 順序表的基本操作

首先了解一下什麼是順序表? 順序表:用一段地址連續的存儲單元依次存儲數據元素的線性結構。 地址連續的空間,一般情況下采用數組,但數組有靜態數組和動態數組,所以順序表分爲靜態順序表和動態順序表。 下面請看順序表的基本操作:

原创 寫一個函數,實現一個有序數組的二分查找。

#include <stdio.h> int binary_search(int arr[],int key,int sz) { int mid = 0; int left = 0; int right = sz

原创 C語言 volatile 關鍵字總結

對 volatile 關鍵字的理解: volatile在英語的意思是:揮發性的, 不穩定的, 易變的. 在編程中不是是很容易被理解的它, 加上平常很少被用到, 再加上它更多地被用於硬件編程方面, 所以就更加讓一些人琢磨不透了. 總之,

原创 函數遞歸

什麼是遞歸? 程序調用自身的編程技巧稱爲遞歸( recursion)。 遞歸做爲一種算法在程序設計語言中廣泛應用。 一個過程或函數在其定義 或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問 題層層轉化爲一個與原問題相

原创 模擬實現殭屍進程、孤兒進程的場景

首先了解一下什麼是殭屍進程、什麼是孤兒進程。 (1)Z(zombie)殭屍進程 殭屍狀態(zombie)是一個比較特殊的狀態。當進程退出並且父進程(使用wait()系統調用)沒有讀取到子進程退出的返回代碼時就會產生殭屍進程。 殭屍進程會

原创 利用遞歸輸出一個整數的每一位

#include <stdio.h> int _print(int num) { if (num < 10) printf("%d ", num); else { _print(num / 10); prin

原创 計算n的階乘和

實現思路:問題中的階乘n需要從鍵盤輸入,先計算n的階乘,就得有一個變量i從1遍歷到n,進入循環有一個變量ret,初始值爲1,來記住本次的乘積ret*i,隨着i的增加,當i增加到n時,輸出ret。在定義一個sum,每項得出的結果ret加到s

原创 實現一個函數,判斷一個數是不是素數。

#include <stdio.h> #include <math.h> int Is_prime(int n) { int i = 0; for (i = 2; i <= sqrt(n); i++) {